[Szerverkészítés] - Csevegő

Indította - Chevrolet -, 2015-12-19, 18:46:35

2016-05-16, 19:43:28 #100 Utolsó szerkesztés: 2016-05-16, 19:45:45 Szerző: Red
Mondjuk én egy masodikbela-t vagy egy penger-t tudnék elképzelni erre a posztra. De, az egyértelmű, hogy nem mindenki kerülhetne be a csapatba. Mondjuk ez tényleg csak úgy működne ha, nem lenne bevétel a szerveren csak max annyi amiből fent lehet tartani. Talán még kevesebb szégyen szerver is lenne ha elvinnénk a játékosokat.


Most egy nem ide illő téma.
Olyan embert keresek aki, letesztelné a szerveremet sql inject, mob céhbe hívás és stb.. hackek ellen.
Akár még szét is ddos-olhatja.

Idézetet írta: [MOD]Linos Dátum 2016-05-16, 19:16:50
Darre, te is nagyon jól tudod hogy nem a hírnévre megy a játék a szerverek 99%-ánál, abban is biztos vagyok hogy az osztozás nem működne, illetve valakinek ugyan úgy a fejébe szállna a hatalom / kísértés esetleg 300-500 playernél.


Pontosan. Lehet máshol működik, de itt Magyarország countryban biztosan nem. Előbb-utóbb lenen valaki akinek vagy a hatalom szállna a fejébe, vagy csak lenyúlná, vagy csak besértődne és akkor akinek a nevén van a vps lenyúlja stb... Még esetleg ha úgy lenne megcsinálva, hogy nonprofit az egész és "nincs mit lenyúlni" az eszmei értékén kívül a dolognak akkor TALÁN van némi remény az egészben, de még akkor is ott van, hogy valaki szabotálja a hadműveletet justforfun, meg a többi dolog.

+ azon is nagyon jól össze lehet veszni, hogy ki férjen hozzá a fájlokhoz, ki fejlesztheti, ki módosíthat a kódokon. Nyilván ha publicba megy a dolog mindenki hozzáférhetne, de gondolom egyértelmű, hogy lenne egy "trusted" team aki meg szerkesztheti a kódot. És akkor itt jön az, hogy "háténmértnemnyúlhatokbeleplspls?" meg a társai.

Idézetet írta: Don Dátum 2016-05-16, 19:19:14
Össze fogna 5-6 komolyabb fejlesztő akkor nem 500-játékos lenne ..és értelem szerűen bevétel nő, de szerverek 99% hírnévre megy..:)

Leginkább magányos farkasok vagyunk (és most akkor közéjük soroltam magam, pedig nyíltan soha nem szoktam ilyet állítani meg nem is szeretek, mert hát szerények vagyunk, meg mindenki döntse el minek gondol, de most a mondatok egyszerűsége miatt kivételt teszek) én úgy vettem észre. Néha ha #stacked van vagy kérdésünk van a másik felé feltesszük, illetve válaszolunk rá nagy örömmel, mert végre valaki olyan kérdez tőlünk aki tud programozóul, és nem casual/mainstream kérdéseket tesz fel, hanem valódi programozással kapcsolatos kérdéseket. Pl logikai kérdések, ezt mér úgy, mér így, stb...

Viszont lehet épp a tudás miatt, de nem szorulunk pátyolgatásra, vagy komolyabb együttműködésre, és ki-ki a saját módján dolgozik. Csinálja ami neki tetszik, gfes cuccokat reprodukál, RE-zik pár dolgot, vagy éppen csak megrendelésre csinál dolgokat, stb... Szóval szerintem ezért nincs "köztünk" ilyen komolyabb összefogásra igény, vagy hogy együtt csináljunk egy szervert.
Mellesleg én szerintem egyikünk sem vezér egyéniség (én szerintem legalább is, de az biztos, hogy én tutira nem), és (szintén én úgy vettem észre, de rám viszont biztosan igaz) olyan nagyon önálló gondolatunk nem túl sokszor van, hogy mit kéne alkotni, valaki megmondja hogy mit csináljunk, hogy nézzen ki, hogy legyen, és akkor az olyan lesz és kész. Szóval pl én nem tudnék kitalálni valami űber szuper világmegváltó metintervet, attól függetlenül hogy valószínűleg össze tudnám rakni, ha lenne egy.

(Megjegyezném, hogy amikor ezt elkezdtem írni, akkor még az utolsó hozzászólás az az általam berakott 2. idézet volt, és közben ahogy elnézem a felét közösen össze is raktátok, amit mondani akartam.)
Ha nem látod a válaszom, valamit elrontottál:

Én ismerem magamat annyira, hogy tudjam, nem lennék jó "fővezér" :)
Márcsak azért sem, mert az itt jelen lévő fórumozók közül aligha ismerek személyesen egy s mást, ismeretlenül pedig a bizalom ilyen tippszmiksz.

Idézetet írta: - Chevrolet - Dátum 2016-05-16, 19:40:39
Atagról szerintem is lemondhatsz, P3NG3R meg elissza a bevételt pls  :-[
Ez fájt :( :D


2016-05-16, 21:11:31 #104 Utolsó szerkesztés: 2016-05-16, 21:14:14 Szerző: [MOD]Step
Idézetet írta: [VIP]P3NG3R Dátum 2016-05-16, 20:59:35
"fővezér" :)
P3NG3Rusz Prájm? :D
Csak Te egy sörszállító kamionból változol át hipermegaszuper metin2 fejlesztővé? ???

Heheheee áááááááá ez nagyon nagy volt!!! :D :D :D

Idézetet írta: Ðarre™ Dátum 2016-05-15, 18:12:35
Ha már mindenki tropán van ezen témában akkor felteszem én is a kérdést..  :-\
---
Hogy is van az a tárhelyről történő index fájl betöltés?
???

Egyébként visszatérve erre Unc összerakott egy basic winapis fájlletöltőt, nem kell hozzá semmi külső lib meg ilyenek... https://pastebin.com/d6tNKe17

A buffer alapjáraton duplázódik, szal nincs optimalizálva, de ha tudod mekkora fájlt akarsz letölteni, akkor tudod azt is, hogy mekkora buffert adj neki :P
Ha nem látod a válaszom, valamit elrontottál:

2016-05-16, 22:38:06 #107 Utolsó szerkesztés: 2016-05-16, 22:43:57 Szerző: [VIP]P3NG3R
[spoiler]Miért nem tudok thenkszt adni? :o[/spoiler]

Kiégtem mint a villanykörte ;D
Ám köszi béla, és köszi Unc-nak is.

szerk.: Ejjnye.. most nézem, hogy valaki redukálta a hozzászólásaimat .
Ezé' két sört kérek, mégha offhsz-ok voltak is :D.

Idézetet írta: masodikbela Dátum 2016-05-16, 21:59:55
Idézetet írta: Ðarre™ Dátum 2016-05-15, 18:12:35
Ha már mindenki tropán van ezen témában akkor felteszem én is a kérdést..  :-\
---
Hogy is van az a tárhelyről történő index fájl betöltés?
???

Egyébként visszatérve erre Unc összerakott egy basic winapis fájlletöltőt, nem kell hozzá semmi külső lib meg ilyenek... https://pastebin.com/d6tNKe17

A buffer alapjáraton duplázódik, szal nincs optimalizálva, de ha tudod mekkora fájlt akarsz letölteni, akkor tudod azt is, hogy mekkora buffert adj neki :P
Köszönöm, holnapi nap folyamán összedobom.. :0
Nem tudom mennyi sikerrel, és mennyire eredményesen de szerintem menni fog.. ha mégsem akkor hát ezvan! Viszont te ezt már elkészítetted 1x nem? Mivel régebben olvastam az MBC0R3-ról szóló changelog-ot, és ott írtál valami arról, hogy virtuálisan történne az .eix betöltése stb.. Nos, szerintem sok fórumozó megköszönné ezt ha készítenél róla egy tutorial szerűséget..
:P

Idézetet írta: Ðarre™ Dátum 2016-05-17, 00:18:16
Idézetet írta: masodikbela Dátum 2016-05-16, 21:59:55
Idézetet írta: Ðarre™ Dátum 2016-05-15, 18:12:35
Ha már mindenki tropán van ezen témában akkor felteszem én is a kérdést..  :-\
---
Hogy is van az a tárhelyről történő index fájl betöltés?
???

Egyébként visszatérve erre Unc összerakott egy basic winapis fájlletöltőt, nem kell hozzá semmi külső lib meg ilyenek... https://pastebin.com/d6tNKe17

A buffer alapjáraton duplázódik, szal nincs optimalizálva, de ha tudod mekkora fájlt akarsz letölteni, akkor tudod azt is, hogy mekkora buffert adj neki :P
Köszönöm, holnapi nap folyamán összedobom.. :0
Nem tudom mennyi sikerrel, és mennyire eredményesen de szerintem menni fog.. ha mégsem akkor hát ezvan! Viszont te ezt már elkészítetted 1x nem? Mivel régebben olvastam az MBC0R3-ról szóló changelog-ot, és ott írtál valami arról, hogy virtuálisan történne az .eix betöltése stb.. Nos, szerintem sok fórumozó megköszönné ezt ha készítenél róla egy tutorial szerűséget..
:P

Sok fórumozó meg idegösszeroppanást kapna. Inkább tartsa magában. :)

2016-05-17, 13:11:57 #110 Utolsó szerkesztés: 2016-05-17, 13:40:27 Szerző: masodikbela
Tényleg eltûnt a thanks.

Am azok nagyrèsze csak terv volt, de nyilván volt alapja mindnek. Indexre pl meg volt már csinálva. Am azokat még libcurllal csináltam, Unc csak tegnap szólt h minek a curl mikor winapinak is van megfelelô fvje. (Bezzeg mikor anno nem tudtam mivel csináljam nem szólt volna :P)
Ha nem látod a válaszom, valamit elrontottál:

Egyébként nem tudom érdekel-e valakit rajtam kívül, de már többször véltem felfedezni néhány a szemet zavaró felesleges furcsa megoldást. Ilyen például a BELT_INVENTORY mint különálló ablak, ami a forrásban még nem az, de elnézve a GF bint, ott már a felszerelés is teljesen elkülönült a leltártól.
Van ez a lekérdezés a forrázsban:
enum EWindows
{
RESERVED_WINDOW,
INVENTORY,
EQUIPMENT,
SAFEBOX,
MALL,
DRAGON_SOUL_INVENTORY,
BELT_INVENTORY,
GROUND,

WINDOW_TYPE_MAX,
};


const TItemData * CPythonPlayer::GetItemData(TItemPos Cell) const
{
if (!Cell.IsValidCell())
return NULL;

switch (Cell.window_type)
{
case INVENTORY:
case EQUIPMENT:
return &m_playerStatus.aItem[Cell.cell];
case DRAGON_SOUL_INVENTORY:
return &m_playerStatus.aDSItem[Cell.cell];
default:
return NULL;
}
}


Ami hivatalosan így fest pseudoban ma:
int __fastcall CPythonPlayer::GetItemData(int a1, int a2, int a3)
{
  int result; // eax@2
  int v4; // [sp+4h] [bp-4h]@1

  v4 = a1;
  if ( SItemPos::IsValidCell((int)&a3) )
  {
    switch ( (unsigned __int8)a3 )
    {
      case 1u:
        result = v4 + 50 * *(unsigned __int16 *)((char *)&a3 + 1) + 140;
        break;
      case 2u:
        result = v4 + 50 * *(unsigned __int16 *)((char *)&a3 + 1) + 9140;
        break;
      case 5u:
        result = v4 + 50 * *(unsigned __int16 *)((char *)&a3 + 1) + 12140;
        break;
      case 6u:
        result = v4 + 50 * *(unsigned __int16 *)((char *)&a3 + 1) + 11340;
        break;
      default:
        result = 0;
        break;
    }
  }
  else
  {
    result = 0;
  }
  return result;


És c++-ban:
typedef struct SPlayerStatus
{
TItemData aInventoryItem[c_Inventory_Count];//180 aka 4*45
TItemData aEquipmentItem[c_Wear_Max + c_DragonSoul_Equip_Slot_Max * DS_DECK_MAX_NUM];//44 aka 32 + 2*6
TItemData aDSInventoryItem[c_DragonSoul_Inventory_Count];//960 aka 6*5*32
TItemData aBeltInventoryItem[c_Belt_Inventory_Slot_Count];//16 aka 4*4
TQuickSlot aQuickSlot[QUICKSLOT_MAX_NUM];
TSkillInstance aSkill[SKILL_MAX_NUM];
long m_alPoint[POINT_MAX_NUM];
long lQuickPageIndex;

void SetPoint(UINT ePoint, long lPoint);
long GetPoint(UINT ePoint);
} TPlayerStatus;
TPlayerStatus m_playerStatus;


const TItemData * CPythonPlayer::GetItemData(TItemPos Cell) const
{
if (!Cell.IsValidCell())
return NULL;

switch (Cell.window_type)
{
case INVENTORY:
return &m_playerStatus.aInventoryItem[Cell.cell];
case EQUIPMENT:
return &m_playerStatus.aEquipmentItem[Cell.cell];
case DRAGON_SOUL_INVENTORY:
return &m_playerStatus.aDSInventoryItem[Cell.cell];
case BELT_INVENTORY:
return &m_playerStatus.aBeltInventoryItem[Cell.cell];
default:
return NULL;
}
}


[spoiler]char __fastcall SItemPos::IsValidCell(int a1)
{
  char result; // al@2

  switch ( *(_BYTE *)a1 )
  {
    case 1:
      result = (unsigned int)*(_WORD *)(a1 + 1) < 180;
      break;
    case 2:
      result = (unsigned int)*(_WORD *)(a1 + 1) < 44;
      break;
    case 5:
      result = (signed int)*(_WORD *)(a1 + 1) < 960;
      break;
     case 6:
      result = (unsigned int)*(_WORD *)(a1 + 1) < 16;
      break;
   default:
      result = 0;
      break;
  }
  return result;
}
[/spoiler]

Szóval, mindezek alapján az elméletem a következő; Amikor kikerült a forrázs, még csak kezdetleges fázisban volt a slot-ok reformációja, amit mára befejeztek.

Csak egy példa rá, hogy egy felszerelés értékét hogyan kérdezik le az aktuális forrázsban:
CPythonPlayer::CalculateAcceAttributes:
LOBYTE(v50) = 2;//EQUIPMENT
*(unsigned __int16 *)((char *)&v50 + 1) = 22;//ACCE
v54 = CPythonPlayer::GetItemMetinSocket(0, (int)&v17, v50, 0);

int socketInDrainValue = 0;
int iAcceDrainPercent = CPythonPlayer::Instance().GetItemMetinSocket(TItemPos(EQUIPMENT, 22), socketInDrainValue);




Egyébként érdekes. Ugyan sokat nem értek a pseudoból, de azt látom hogy egyel több case van, szóval ha te azt mondod, hogy külön windowként van kezelve, én elhiszem neked :D

Egyébként a pozíció lekérése ragadta meg nekem a szememet. Ha jól rémlik, nálunk most nem csak egy sima TItemPos van? És akkor valahol később döntöd el, hogy az most mégis melyik window? Itt viszont meg TItemPosnak kettő bemeneti érték van megadva, egyik az ablak, másik a slot. (Vagy csak én képzelődök mert nem volt még időm vacsorázni és zsíroskenyeret látok mindenhol?)
Ha nem látod a válaszom, valamit elrontottál:

2016-05-18, 19:36:10 #113 Utolsó szerkesztés: 2016-05-18, 20:17:28 Szerző: Ðarre™
Sokaknak bizonyára lentvan a M*M kliens.. tehát akinek lentvan, abból áttüdná küldeni a víz texturáját? :-\
---

#RESOLVED

[spoiler=Olééé *_*][/spoiler]

Hogyan lehetne megoldani, hogy a szörnyek neveit is db/mob_names.txt-ből olvassa?

De hiszen onnan olvassa. ???
"Tisztelet a kivételnek! Mindig tisztelet a kivételnek!"
"KezdÅ' vagyok, ne nézz le... (:"

2016-05-18, 23:05:35 #116 Utolsó szerkesztés: 2016-05-18, 23:08:10 Szerző: - Chevrolet -
Csak az npc-t :D

A szörnyeket meg kliensből, de hogy minek..

De ha már itt tartunk, akkor annak is örülnék, ha a tárgyak neveit is db/item_names.txt-ből olvasná

Á, ez igaz. De végső soron, mivel úgyis a szerveroldali txt-ből csinálod a kliensoldalit, ezért szerintem édes mindegy, hogy melyik dominál.
"Tisztelet a kivételnek! Mindig tisztelet a kivételnek!"
"KezdÅ' vagyok, ne nézz le... (:"

Ezzel a packettal mennek le a szerverről az adatok a kliensnek, szörny, npc, pc, kutyámfüle stb:
typedef struct packet_add_char
{
BYTE header;
DWORD dwVID;
#ifdef WJ_SHOW_MOB_INFO
DWORD dwLevel;
DWORD dwAIFlag;
#endif
float fScale;
float angle;
long x;
long y;
long z;
BYTE bType;
WORD wRaceNum;
BYTE bMovingSpeed;
BYTE bAttackSpeed;
BYTE bStateFlag;
DWORD dwAffectFlag[2];
} TPacketGCCharacterAdd;


Ezzel meg az npc-k és PC-k tulajdonságait frissítgeti a szerver:
typedef struct packet_char_additional_info
{
BYTE header;
DWORD   dwVID;
char name[CHARACTER_NAME_MAX_LEN + 1];
DWORD awPart[CHR_EQUIPPART_NUM];
BYTE bEmpire;
DWORD dwGuildID;
DWORD dwLevel;
short sAlignment;
BYTE bPKMode;
DWORD dwMountVnum;
} TPacketGCCharacterAdditionalInfo;


És itt megy le a név:
if (IsPC() == true || m_bCharType == CHAR_TYPE_NPC)
{
TPacketGCCharacterAdditionalInfo addPacket;
//[...]
if (false)
{
//[...]
}
else
{
show_all_info:
strlcpy(addPacket.name, GetName(), sizeof(addPacket.name));

const char * CHARACTER::GetName() const
{
return m_stName.empty() ? (m_pkMobData ? m_pkMobData->m_table.szLocaleName : "") : m_stName.c_str();
}


Hozzáadod az első packethez a name változót szerver ill. kliens oldalon és itt átírsz pár sort, és kész is asszem:
bool CPythonNetworkStream::RecvCharacterAppendPacket()

kNetActorData.m_stName="";


const char * c_szName;
CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance();
if (rkNonPlayer.GetName(kNetActorData.m_dwRace, &c_szName))
kNetActorData.m_stName = c_szName;
//else
// kNetActorData.m_stName=chrAddPacket.name;


ui.: Nekem jólvan úgy ahogy van, nem csinálom meg, nincs értelme, úgyhogy ennyit tudtam így kapásból segíteni. DE! Azt még hozzátenném, hogy régen ezt nem véletlenül vették ki, hiszen a szörnyek nevei anno a szerverről érkeztek. Ha berakod, készülj fel, hogy növekedni fog a packet mérete, ami mondjuk egy run esetében, ha beidéződik egy DT8 emeletnyi darab szörny, a kliens nem biztos, hogy fogja bírni kezelni, hisz gyengébb gépű/netű obrékot, így is szórja mint állat, de te tudod :D.

Nice, már csak a klienses protokra kell alapozni az npcneveket és minden remek lesz.  8)
nincs megosztható adat