Hali.
Hogyan tudom a készség könyv nevét a chatban kiírni amikor felveszem a földről vagy kereskedek és úgy kapom meg?
A készségkönyv neve a földön megjelenik mert azt beraktam a kliensbe, viszont szeretném ha chatben és eldobásnál is az item neve megjelenne teljesen.
Valakinek van ötlete?
A linkelésre gondolsz?
Mert akkor ott is ki kell ugyanúgy egészíteni a dolgot ahogy a földön lévő cuccosnál.
A tárgy kidobás és felvételnél gondoltam.
A tárgy kidobás rákérdezésnél már kiötlöttem egy megoldást: slotPos -> GetItemMetinSocket -> GetSkillName
Szerver oldalon most a skill könyv felvételét próbálom megoldani, hogy teljes nevét írja ki.
Üzenet összefésülés: 2017-11-22, 21:04:36
Idáig jutottam eddig:
string name = "";
if (item2->GetVnum() == 50300) {
int SocketBookID = item2->GetSocket(0);
name = "Itt szeretném kikérni a grade data-t valahogy igy, de ez kliens oldali metódus: c_pSkillData->GradeData[0].strName.c_str();"
name += " ";
}
name += item2->GetName();
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("아이템 획득: %s"), name);
Szerintem szerver oldalon nincs ilyen név lekérdezés, hisz ott nincs is rá szükség. (ha mégis akk sry)
Esetleg ha ez működik:
const CSkillProto* pkSk = CSkillManager::instance().Get(dwSkillVnum);
Akkor skill ID alapján le tudod kérni az adatait, és van egy olyan adattagja h "szName". Ha szerencséd van ez az amire szükséged van.
A karakter kodolás nem tetszik neki...
Hoigy egységesítsem, mert már vagy 20 féle képpen próbáltam...
Nem tetszik ha az egyik cost char, vagy std:string vagy sima char probáltam konverktálni c_str()...
Mert a "pkSk.szName" az "char" és a "item2->GetName()" az const char *, de nekem meg stringbe kell formáznom.
std::string std = "";
if (item2->GetVnum() == 50300) {
DWORD SocketBookID = item2->GetSocket(0);
const CSkillProto* pkSk = CSkillManager::instance().Get(SocketBookID);
if (NULL != pkSk){
std = pkSk.szName;
}
}
std = std + item2->GetName();
ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ľĆŔĚĹŰ Čąµć: %s"), std.c_str());
Üzenet összefésülés: 2017-11-22, 22:25:10
Nah sodrófaa most már lefordul, sikerált összehangolni, mindjárt tesztelem.
Üzenet összefésülés: 2017-11-22, 22:50:15
Ilyen krixkraxokat jelenit meg ha az szName-val kérem le a nevét, ez micsoda? A koreai neve a skill könyvnek?
Csatoltam a képet.
Hát úgy néz ki :-\ ;D
Igen ez a koreai neve ami az item proto.txt-be van.
De ezt hogy tegyem át magyarra? Hogy nézessem vele az item_names-txt-ből?
Sehogy, mivel nincs külön kk minden skillre:
50300 Készségkönyv
1 van, és ennek a socket0-jába írja bele a skill id-jét amihez tartozik asszem.
Szóval ink skill_protoval kéne trükközni, hogy az legyen magyar és működjön.
am a pkSk.szName-mel van a gond, nem az item2->GetName-mel.
vagy irok bele egy localeName metódust ami a item_names ból szedi ki a magyar nevet. Éppen forditom már mert ami azt illeti meg is irtam xD
item_names?
Te megcsináltad minden skillre külön a kk-t? :o :o :o
Átvitt értelemben gyárilag bent van. Ne kérdezd. Nem tudom hogyan.
Üzenet összefésülés: 2017-11-22, 23:22:45
Az ötletem nem vált be, a funkció nem kéri ki mert nem létezőnek érzékeli...
Őm... sztem skill_power.txt-ből szedi a dolgot:
48 ČÁ¶ĆÄ 5 7 9 11 13 15 17 19 20 22 24 26 28 30 32 34 36 38 40 50 52 55 58 61 63 66 69 72 75 80 82 84 87 90 95 100 110 120 130 150
Kérdés hogy elromlik-e vmi ha te itt lemagyarosítod.
Úgy néz ki, hogy az item_proto.txt-ből nézi, mert a skill.cpp,skill.h ezt hívja meg, majd veti össze az item_names.txt-vel amikor a nevét kéred le az sz_Name-val. Valamint az itemp_proto.txt-ben vannak deklarálva a könyvek koreak nevek és ID szerint, és item_names.txt-ben is deklarálva vannak a könyvek név és ID szerint, de itt már magyarul. Nyilván így magyarít a rendszer.
De lehet,hogy csinálok egy skill_names.txt-t azt abba minden socket ID-hez rendelve beírom a magyar skill nevét és cpp-ben csinálok egy kiolvasó funkciót azt cső.
Nemtudom nálad hogy van, alapból 1 KK van csak, és a socketbe menti el melyik skillhez van.
Ha te megcsináltad minden skillhez külön a kk-t akk valóban item_namesből kéne olvasnia, de akkor meg azt nem értem h miért van gond a kiolvasással, hisz ha mindhez van, akk mindhez megadtad a skill nevével együtt nem? ???
Az a baj, hogy török sf-et használok. Szóval egyszer sem biztos hogy külön id-n vannak a könyvek.
Azért mondom próbálkozz meg skill_powerrel, mert amint láttad amit kimásoltam belőle, 100%-ban egyezik azzal amiről küldtél képet h kóreaiul írja ki. Mivel a skill nevét kérdezted le CSkillManager-rel.
Nem biztos, de én nagyon arra tippelek, vagy esetleg navicatból tölti. Egyéb opció szerintem nincs, szóval próbáld meg külön-külön átírni 1 skill-ét és meglátod.
Ha még megvan a kk amiről a képet csináltad akkor pont jó mert tudod h a 48-as skill-t kell magyarosítanod :P
Én ezt használom, magyar skill_proto.sql-lel és múkodik.
[spoiler]const char * CItem::GetName()
{
static char szTemp[128];
memset(szTemp, 0, sizeof(szTemp));
if (GetProto())
{
int len = 0;
switch (GetType())
{
case ITEM_POLYMORPH:
{
const DWORD dwMobVnum = GetSocket(0);
const CMob* pMob = CMobManager::instance().Get(dwMobVnum);
if (pMob)
len = snprintf(szTemp, sizeof(szTemp), "%s", pMob->m_table.szLocaleName);
break;
}
case ITEM_SKILLBOOK:
case ITEM_SKILLFORGET:
{
const DWORD dwSkillVnum = (GetVnum() == 50300 || GetVnum() == 70037) ? GetSocket(0) : 0;
const CSkillProto* pSkill = (dwSkillVnum != 0) ? CSkillManager::instance().Get(dwSkillVnum) : NULL;
if (pSkill)
len = snprintf(szTemp, sizeof(szTemp), "%s", pSkill->szName);
break;
}
}
len += snprintf(szTemp + len, sizeof(szTemp) - len, (len>0)?" %s":"%s", GetProto()->szLocaleName);
}
return szTemp;
}
[/spoiler]
Igen, de a "pkSk->szName"-vel kérem ki a nevet akkor a koreai nevét írja ki.
A butított kód:
const CSkillProto* pkSk = CSkillManager::instance().Get(item->GetSocket(0));
if (NULL != pkSk){
std = pkSk->szName;
}
Talán ha magyar lenne a skill_proto-d akkor magyarul írná :o
Igen mondtam h vagy azt magyarosítsa le v a powert. ;D
Nem mertem, ne hogy elrontson valamit. (FUCK MY LOGIC)
Közben írtam egy funkciót ami kiolvassa fájlból id alapján a skill neveket:
std::ifstream file("skill_book_names.txt");
if (file){
int key;
std::string value;
std::map<int, std::string> skillBookNamesMap;
while (file >> key && file >> value){
skillBookNamesMap[key] = value;
}
std::map<int, std::string>::iterator it;
it = skillBookNamesMap.find(item->GetSocket(0));
if (it != skillBookNamesMap.end()){
std = std + it->second;
}
}
file.close()
Mert nem tudsz nyomni egy Ctrl+C/V-t a fájlra/táblára? :o ??? :-X :'(
Madzsar, túl bonyolítani minden.