Domanda "GetServerLocation: cannot find server for mapindex"

Stato
Discussione chiusa ad ulteriori risposte.

MANGODZILLA

Utente Silver
19 Luglio 2015
92
8
58
88
Ultima modifica:
Buonasera!

Come consuetudine prima di porre questa domanda alla comunità è stata mia premura sfondare il famigerato tasto cerca e rotolare sofferente fino alla terza pagina della ricerca di Google; se mi trovo costretto a scrivere queste parole è perchè quella mia ricerca non è stata in grado di produrre risultati all'altezza della mia situazione (ha prodotto solo qualche risata nel leggere perle come: "elimina la cartella maps e sostituiscila con un altra vedi se ti cambia qualcosa").


Veniamo al dunque:
Lo scenario è costituito da una macchina virtuale dedicata sulla quale girano FreeBSD 12.1 x32 e MySQL 5.6; su questa macchina è stata compilata da codice sorgente (e correttamente integrata), la revisione 41023 dei file di gioco e ne è stato generato il database correlato.
Il tutto è arrivato a funzionare senza alcun intoppo, a testimonianza di ciò i file di log errore sono sempre restati vuoti anche dopo alcuni riavvii del servizio.
Ho creato manualmente attraverso Navicat la mia utenza all'applicativo, limitandomi alla creazione dell'account, senza personaggi giocanti.

Era arrivato per me il momento di spostarmi in client-side: insieme ai files mi è stato fornito un client compatibile (a me congeniale poichè vergine), così dopo averlo configurato per l'accesso lo ho eseguito e sono riuscito ad effettuare con successo il login, trovandomi alla schermata di creazione del personaggio.
Ho inserito il nickname del personaggio che è stato generato con successo, ho proceduto quindi a stappare lo spumante ed ad avviare il gioco mentre soddisfatto lo sorseggiavo.

Il risultato è stato imbarazzante: una volta selezionato il giocatore infatti, dopo l'animazione, sono stato rimandato alla schermata di login.
Ho rimesso lo spumante in frigorifero ed ho cominciato a scavare nei file di log, che allego:
Codice:
SYSERR: Apr 25 13:19:28 :: PlayerCreateSuccess: InputDB::PlayerCreateSuccess: cannot find server for mapindex 0 51830 x 166571 (name NOME)

Ho quindi intuito si trattasse di un qualche problema relativo al caricamento della mappa e della conseguente posizione di spawn evidentemente non valida, "mapindex = 0" mi è subito puzzato molto; ho pertanto scelto di provare ad impostare la posizione del giocatore attraverso la modifica manuale del database in una posizione assimilabile a: "qualche parte nella piazza del villaggio di Shinsoo":
xyz.png


A questo punto ho provato a riavviare il tutto ed ho ritentato fiducioso il mio login: il risultato è stato il medesimo logout che ha prodotto i seguenti log:
Codice:
SYSERR: Apr 25 14:01:37 :: GetServerLocation: location error name NOME mapindex 0 640 x 540 empire 1
SYSERR: Apr 25 14:01:37 :: GetServerLocation: cannot find server for mapindex 0 469300 x 964200 (name NOME)
Il successivo tentativo che ho fatto è stato la creazione di un altro account, con un altro giocatore, in un regno diverso da Shinsoo; ma il risultato è stato il medesimo logout dopo la selezione ed i log con mapindex invalidi.
Le svariate ore successive le ho impiegate per ricercare nei meandri dei vari forum qualche concetto chiave che potesse farmi capire con che cosa avevo a che fare, ma alla fine mi trovo qui ad impaginare questa discussione.

Ho notato appunto che la variabile "mapindex" continuava a puzzare: essendo nuovamente uguale a zero, nonostante io la avessi manualmente settata a tre; in virtù di ciò posso immaginare che vi sia una qualche incoerenza nella gestione delle mappe.


Aggiungo il file CONFIG del core1 nel ch1:
Codice:
VIEW_RANGE: 10000
PASSES_PER_SEC: 25
SAVE_EVENT_SECOND_CYCLE: 180
PING_EVENT_SECOND_CYCLE: 180
DB_ADDR: 127.0.0.1
COMMON_SQL: 127.0.0.1 utente password common 3306
LOG_SQL: 127.0.0.1 utente password log 3306
ADMINPAGE_IP1: 192.168.1.10x
ADMINPAGE_PASSWORD: 58948HG83H4G8H84x
MAX_LEVEL: 120
CHANGE_ATTR_TIME_LIMIT: 0
EMOTION_MASK_REQUIRE: 0
PRISM_ITEM_REQUIRE: 0
SHOP_PRICE_3X_TAX: 0
GLOBAL_SHOUT: 1
ITEM_COUNT_LIMIT: 250
STATUS_POINT_GET_LEVEL_LIMIT: 120
STATUS_POINT_SET_MAX_VALUE: 90
SHOUT_LIMIT_LEVEL: 15
DB_LOG_LEVEL: 1
EMPIRE_LANGUAGE_CHECK: 0
PLAYER_SQL: 127.0.0.1 utente password player 3306
HOSTNAME: srv1-ch1-core1
CHANNEL: 1
MAP_ALLOW: 1 21 41 3 23 43 4 24 44 5 25 45 108 109 112
PORT: 30003
P2P_PORT: 30004
DB_PORT: 30000

Altresì il file "index" nella cartella "map" del locale, che ovviamente non riporta nessun valore "0".
1 metin2_map_a1
3 metin2_map_a3
4 metin2_map_guild_01
5 metin2_map_monkey_dungeon_11
6 metin2_guild_village_01
21 metin2_map_b1
23 metin2_map_b3
24 metin2_map_guild_02
25 metin2_map_monkey_dungeon_12
26 metin2_guild_village_02
41 metin2_map_c1
43 metin2_map_c3
44 metin2_map_guild_03
45 metin2_map_monkey_dungeon_13
46 metin2_guild_village_03
61 map_n_snowm_01
62 metin2_map_n_flame_01
63 metin2_map_n_desert_01
64 map_n_threeway
65 metin2_map_milgyo
66 metin2_map_deviltower1
67 metin2_map_trent
68 metin2_map_trent02
69 metin2_map_WL_01
70 metin2_map_nusluck01
71 metin2_map_spiderdungeon_02
72 metin2_map_skipia_dungeon_01
73 metin2_map_skipia_dungeon_02
81 metin2_map_wedding_01
100 metin2_map_fielddungeon
101 metin2_map_resources_zon
103 metin2_map_t1
104 metin2_map_spiderdungeon
105 metin2_map_t2
107 metin2_map_monkey_dungeon
108 metin2_map_monkey_dungeon2
109 metin2_map_monkey_dungeon3
110 metin2_map_t3
111 metin2_map_t4
112 metin2_map_duel
113 metin2_map_oxevent
114 metin2_map_sungzi
118 metin2_map_sungzi_flame_hill_01
119 metin2_map_sungzi_flame_hill_02
120 metin2_map_sungzi_flame_hill_03
121 metin2_map_sungzi_snow
122 metin2_map_sungzi_snow_pass01
123 metin2_map_sungzi_snow_pass02
124 metin2_map_sungzi_snow_pass03
125 metin2_map_sungzi_desert_01
126 metin2_map_sungzi_desert_hill_01
127 metin2_map_sungzi_desert_hill_02
128 metin2_map_sungzi_desert_hill_03
181 metin2_map_empirewar01
182 metin2_map_empirewar02
183 metin2_map_empirewar03
200 gm_guild_build
208 metin2_map_skipia_dungeon_boss
216 metin2_map_devilcatacomb
217 metin2_map_spiderdungeon_03
301 Metin2_map_CapeDragonHead
302 metin2_map_dawnmistwood
303 metin2_map_BayBlackSand
304 metin2_map_Mt_Thunder
351 metin2_map_n_flame_dungeon_01
130 natural_map
131 deep_underwater_cave
132 plechito_owl_map

Un log relativo ad un accesso ed ad un tentato ingresso nella mappa:
Codice:
Apr 25 22:54:10 :: LOGIN_BY_KEY: account key 92261280x
Apr 25 22:54:10 :: LoginSuccess
Apr 25 22:54:10 ::     player(NOME).job(7)
Apr 25 22:54:10 ::     player().job(0)
Apr 25 22:54:10 ::     player().job(0)
Apr 25 22:54:10 ::     player().job(0)
Apr 25 22:54:10 ::     player().job(0)
Apr 25 22:54:10 :: SECTREE_MANAGER::GetMapIndex(640, 540)
Apr 25 22:54:10 :: CMapLocation::Get - Error MapIndex[0]
SYSERR: Apr 25 22:54:10 :: GetServerLocation: location error name NOME mapindex 0 640 x 540 empire 1
Apr 25 22:54:10 :: SECTREE_MANAGER::GetMapIndex(469300, 964200)
Apr 25 22:54:10 :: CMapLocation::Get - Error MapIndex[0]
SYSERR: Apr 25 22:54:10 :: GetServerLocation: cannot find server for mapindex 0 469300 x 964200 (nameNOME)
Apr 25 22:54:10 :: InputDB::login_success: account
Apr 25 22:54:13 :: SYSTEM: new connection from [88.88.88.88] fd: 20 handshake 204253021 output input_len 0, ptr 0x29da1100
Apr 25 22:54:13 :: MARK_SERVER: Login
Apr 25 22:54:14 :: MARK_SERVER: GuildMarkIDXList 7 bytes sent.
Apr 25 22:54:14 :: SYSTEM: closing socket. DESC #20
Apr 25 22:54:14 :: SYSTEM: closing socket. DESC #19


#AGGIORNAMENTO#

Effettuando il login dalla rete locale in cui gira il server, il login procede senza intoppi ed il personaggio viene correttamente caricato all'interno della mappa.
Questo dovrebbe spostare la ricerca della soluzione in tutta un'altra direzione.

Ho effettuato un'ulteriore prova, aprendo tutte le porte in entrata ed in uscita verso il server sia sul router che sul firewall, provado ad effettuare il login da rete esterna il risultato è stato sempre negativo.


Mi rendo conto di trovarmi nel dominio di competenza del gioco stesso, la mia competenza qui è pari solo a ciò che riesco ad intuire come programmatore, quindi prima di cominciare a muovermi spaccando tutto penso sia doveroso appellarmi a chi ha più esperienza di me e probabilmente sa indirizzarmi verso ciò che devo allineare per risolvere questo inconveniente tecnico e poter finalmente sorseggiare il mio fottuto spumante davanti al villaggio di Shinsoo.


Come sempre vi ringrazio anticipatamente e vi ricordo di lavarvi le mani spesso.

Con amore

- MANGODZILLA
 
Ultima modifica:
Potresti postare il CONFIG del core del channel1?

Assolutamente, grazie per la risposta!

Codice:
VIEW_RANGE: 10000
PASSES_PER_SEC: 25
SAVE_EVENT_SECOND_CYCLE: 180
PING_EVENT_SECOND_CYCLE: 180
DB_ADDR: 127.0.0.1
COMMON_SQL: 127.0.0.1 utente password common 3306
LOG_SQL: 127.0.0.1 utente password log 3306
ADMINPAGE_IP1: 192.168.1.10x
ADMINPAGE_PASSWORD: 58948HG83H4G8H84x
MAX_LEVEL: 120
CHANGE_ATTR_TIME_LIMIT: 0
EMOTION_MASK_REQUIRE: 0
PRISM_ITEM_REQUIRE: 0
SHOP_PRICE_3X_TAX: 0
GLOBAL_SHOUT: 1
ITEM_COUNT_LIMIT: 250
STATUS_POINT_GET_LEVEL_LIMIT: 120
STATUS_POINT_SET_MAX_VALUE: 90
SHOUT_LIMIT_LEVEL: 15
DB_LOG_LEVEL: 1
EMPIRE_LANGUAGE_CHECK: 0
PLAYER_SQL: 127.0.0.1 utente password player 3306
HOSTNAME: srv1-ch1-core1
CHANNEL: 1
MAP_ALLOW: 1 21 41 3 23 43 4 24 44 5 25 45 108 109 112
PORT: 30003
P2P_PORT: 30004
DB_PORT: 30000
 
Ho avuto anche io un problema simile ma non ho capito come sono riuscito a risolverlo.
In sostanza la 'y' prendeva un valore destinato ad 'x' e map_index andava a 0.
Prova a controllare il file "ClientManagerPlayer", dai uno sguardo alla funzione "bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)".
Mi dispiace non poterti essere di ulteriore aiuto.
 
Ho avuto anche io un problema simile ma non ho capito come sono riuscito a risolverlo.
In sostanza la 'y' prendeva un valore destinato ad 'x' e map_index andava a 0.
Prova a controllare il file "ClientManagerPlayer", dai uno sguardo alla funzione "bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)".
Mi dispiace non poterti essere di ulteriore aiuto.
Grazie per il tuo contributo!
Dando una rapida occhiata non mi è parso di trovare eccezioni in quella funzione, potrei però sbagliarmi; te la allego.

(...)

bool CreatePlayerTableFromRes(MYSQL_RES * res, TPlayerTable * pkTab)
{
if (mysql_num_rows(res) == 0) // 데이터 없음
return false;

memset(pkTab, 0, sizeof(TPlayerTable));

MYSQL_ROW row = mysql_fetch_row(res);

int col = 0;

// "id,name,job,voice,dir,x,y,z,map_index,exit_x,exit_y,exit_map_index,hp,mp,stamina,random_hp,random_sp,playtime,"
// "gold,level,level_step,st,ht,dx,iq,exp,"
// "stat_point,skill_point,sub_skill_point,stat_reset_count,part_base,part_hair,"
// "skill_level,quickslot,skill_group,alignment,mobile,horse_level,horse_riding,horse_hp,horse_stamina FROM player%s WHERE id=%d",
str_to_number(pkTab->id, row[col++]);
strlcpy(pkTab->name, row[col++], sizeof(pkTab->name));
str_to_number(pkTab->job, row[col++]);
str_to_number(pkTab->voice, row[col++]);
str_to_number(pkTab->dir, row[col++]);
str_to_number(pkTab->x, row[col++]);
str_to_number(pkTab->y, row[col++]);
str_to_number(pkTab->z, row[col++]);
str_to_number(pkTab->lMapIndex, row[col++]);
str_to_number(pkTab->lExitX, row[col++]);
str_to_number(pkTab->lExitY, row[col++]);
str_to_number(pkTab->lExitMapIndex, row[col++]);
str_to_number(pkTab->hp, row[col++]);
str_to_number(pkTab->sp, row[col++]);
str_to_number(pkTab->stamina, row[col++]);
str_to_number(pkTab->sRandomHP, row[col++]);
str_to_number(pkTab->sRandomSP, row[col++]);
str_to_number(pkTab->playtime, row[col++]);
str_to_number(pkTab->gold, row[col++]);
str_to_number(pkTab->level, row[col++]);
str_to_number(pkTab->level_step, row[col++]);
str_to_number(pkTab->st, row[col++]);
str_to_number(pkTab->ht, row[col++]);
str_to_number(pkTab->dx, row[col++]);
str_to_number(pkTab->iq, row[col++]);
str_to_number(pkTab->exp, row[col++]);
str_to_number(pkTab->stat_point, row[col++]);
str_to_number(pkTab->skill_point, row[col++]);
str_to_number(pkTab->sub_skill_point, row[col++]);
str_to_number(pkTab->stat_reset_count, row[col++]);
str_to_number(pkTab->part_base, row[col++]);
str_to_number(pkTab->parts[PART_HAIR], row[col++]);

(...)
 
Ultima modifica:
Controlla se corrispondono alle tabelle che trovi in player - > player
 
Ultima modifica:
Controlla se corrispondono alle tabelle che trovi in player - > player
E' esattamente ciò che ho controllato; nello specifico noto che alcune variabili sono in ordine diverso, tuttavia il nome che viene assegnato è corretto e non sembra poter venir scritto nel database in maniera "sfalsata".
Codice:
:id                    str_to_number(pkTab->id, row[col++]);
:account_id            CLoginData* pLoginData1 = GetLoginDataByAID(temp1->account_id);
:name                strlcpy(pkTab->name, row[col++], sizeof(pkTab->name));
:job                str_to_number(pkTab->job, row[col++]);
:voice                str_to_number(pkTab->voice, row[col++]);
:dir                str_to_number(pkTab->dir, row[col++]);
:x                    str_to_number(pkTab->x, row[col++]);
:y                    str_to_number(pkTab->y, row[col++]);
:z                    str_to_number(pkTab->z, row[col++]);
:map_index            str_to_number(pkTab->lMapIndex, row[col++]);
:exit_x                str_to_number(pkTab->lExitX, row[col++]);
:exit_y                str_to_number(pkTab->lExitY, row[col++]);
:exit_map_index        str_to_number(pkTab->lExitMapIndex,  row[col++]);
:hp                    str_to_number(pkTab->hp, row[col++]);
:mp                    str_to_number(pkTab->sp, row[col++]);
:stamina            str_to_number(pkTab->stamina, row[col++]);
:random_hp            str_to_number(pkTab->sRandomHP, row[col++]);
:random_sp            str_to_number(pkTab->sRandomSP, row[col++]);
:playtime            str_to_number(pkTab->playtime, row[col++]);
:level                str_to_number(pkTab->level, row[col++]);
:level_step            str_to_number(pkTab->level_step, row[col++]);
:st                    str_to_number(pkTab->st, row[col++]);
:ht                    str_to_number(pkTab->ht, row[col++]);
:dx                    str_to_number(pkTab->dx, row[col++]);
:iq                    str_to_number(pkTab->iq, row[col++]);
:exp                str_to_number(pkTab->exp, row[col++]);
:gold                str_to_number(pkTab->gold, row[col++]);
:stat_point            str_to_number(pkTab->stat_point, row[col++]);
:skill_point        str_to_number(pkTab->skill_point, row[col++]);
:quickslot            thecore_memcpy(pkTab->quickslot, row[col], sizeof(pkTab->quickslot));
:ip
:part_main
:part_base            str_to_number(pkTab->part_base, row[col++]);
:part_hair            str_to_number(pkTab->parts[PART_HAIR], row[col++]);
:skill_group        str_to_number(pkTab->skill_group, row[col++]);
:skill_level
:alignment            str_to_number(pkTab->lAlignment, row[col++]);
:last_play
:change_name
:mobile                strlcpy(pkTab->szMobile, row[col], sizeof(pkTab->szMobile));
:sub_skill_point    str_to_number(pkTab->sub_skill_point, row[col++]);
:stat_reset_count    tr_to_number(pkTab->stat_reset_count, row[col++]);
:horse_hp            str_to_number(pkTab->horse.sHealth, row[col++]);
:horse_stamina        str_to_number(pkTab->horse.sStamina, row[col++]);
:horse_level        str_to_number(pkTab->horse.bLevel, row[col++]);
:horse_hp_droptime    str_to_number(pkTab->horse.dwHorseHealthDropTime, row[col++]);
:horse_riding        str_to_number(pkTab->horse.bRiding, row[col++]);
:horse_skill_point
Messaggio unito automaticamente:


Ho aggiornato la discussione includendo il risultato dell'ultima prova che ho fatto: il login da rete LAN nella quale gira il server.
L'esito è stato un login pulito ed uno spawn nella mappa regolare.

A questo punto pare che il problema sia da ricercarsi sul lato di networking (?)
 
Ultima modifica:
Il login dalla stessa rete della macchina funziona, il login esterno no.

Condividi per favore il tuo config cpp, e vediamo come vengono gestite le connessioni esterne.
 
Stato
Discussione chiusa ad ulteriori risposte.
Indietro
Top Bottom