[Py, C++]rendszerek, és fixek.

Indította T0gy3R, 2016-04-17, 20:47:12

2016-04-17, 20:47:12 Utolsó szerkesztés: 2017-05-13, 16:36:07 Szerző: T0gy3R
Sziasztok.!
Tudom.. sokan ellene vannak annak amit most teszek, de Epvp-n és dev-en is találtam erről témát, nem beszélve arról, hogy ezt legolcsóbban 30 €-ért tudnátok beszerezni.Illetve mindig picit ódzkodok a nem magyar forumon publikált dolgoktól.Nem azért mert nem értem mi merre hány méter. Ez a rendszer (hívjuk annak..)Ellenőrzi, ha új tárgyat kapsz (Legyen az ládából nyitott, földről felvett, küldetésből kapott, kereskedésnél cserélt tárgy) akkor -az auto poti féle - effektet rak az adott tárgy köré. és rajta hagyja addig míg rá nem húzzuk az egeret.!Ez a módosítás game, és indító fájl forrást igényel, tehát régi Szerverekbe, kliensekbe ez alapján a leírás alapján nem lehet beüzemelni!!
Biztonsági mentést csinálj mielőtt elkezded biztos ami nem biztos...

Itt egy kép esetleg annak, aki nem értené:




Kliens

EterPythonLib ->PythonSlotWindow.h
Keress rá erre:
CAniImageBox * m_pSlotActiveEffect;


cseréld erre:
CAniImageBox * m_apSlotActiveEffect[3];



EterPythonLib ->PythonSlotWindow.cpp
Keress rá erre:
if (!m_pSlotActiveEffect)

cseréld erre:
if (!m_apSlotActiveEffect[0] ||
!m_apSlotActiveEffect[1] ||
!m_apSlotActiveEffect[2])


Keress rá erre:
if (m_pSlotActiveEffect)
m_pSlotActiveEffect->Update();


cseréld erre:
for (int i = 0; i < 3; ++i)
if (m_apSlotActiveEffect[i])
m_apSlotActiveEffect[i]->Update();


Keress rá erre:
if (rSlot.bActive)
if (m_pSlotActiveEffect)
{
int ix = m_rect.left + rSlot.ixPosition;
int iy = m_rect.top + rSlot.iyPosition;
m_pSlotActiveEffect->SetPosition(ix, iy);
m_pSlotActiveEffect->Render();
}


cseréld erre:
if (rSlot.bActive)
{
int iSize = ((int)rSlot.byyPlacedItemSize) - 1;
if (iSize >= 0 && iSize < 3 && m_apSlotActiveEffect[iSize])
{
int ix = m_rect.left + rSlot.ixPosition;
int iy = m_rect.top + rSlot.iyPosition;
m_apSlotActiveEffect[iSize]->SetPosition(ix, iy);
m_apSlotActiveEffect[iSize]->Render();
}
}


Keress rá erre:
m_pSlotActiveEffect = new CAniImageBox(NULL);
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/00.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/01.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/02.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/03.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/04.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/05.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/06.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/07.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/08.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/09.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/10.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/11.sub");
m_pSlotActiveEffect->AppendImage("d:/ymir work/ui/public/slotactiveeffect/12.sub");
m_pSlotActiveEffect->SetRenderingMode(CGraphicExpandedImageInstance::RENDERING_MODE_SCREEN);
m_pSlotActiveEffect->Show();

Ez de csúnyán volt megoldva amúgy...

cseréld erre:
for (int i = 0; i < 3; ++i)
{
CAniImageBox* pEff = new CAniImageBox(NULL);

for (int j = 0; j <= 12; ++j)
{
char buf[64+1];
sprintf_s(buf, "d:/ymir work/ui/public/slotactiveeffect/slot%d/%02d.sub", (i+1), j);
pEff->AppendImage(buf);
}

pEff->SetRenderingMode(CGraphicExpandedImageInstance::RENDERING_MODE_SCREEN);
pEff->Show();

m_apSlotActiveEffect[i] = pEff;
}



Keress rá erre:
if (m_pSlotActiveEffect)
{
delete m_pSlotActiveEffect;
m_pSlotActiveEffect = NULL;
}


cseréld erre:
for (int i = 0; i < 3; ++i)
{
if (m_apSlotActiveEffect[i])
{
delete m_apSlotActiveEffect[i];
m_apSlotActiveEffect[i] = NULL;
}
}



Keress rá erre:
m_pSlotActiveEffect = NULL;

cseréld erre:
for (int i = 0; i < 3; ++i)
m_apSlotActiveEffect[i] = NULL;


root ->interfaceModule.py

Keress rá erre:
def Highligt_Item(self, inven_type, inven_pos):
if player.DRAGON_SOUL_INVENTORY == inven_type:
if app.ENABLE_DRAGON_SOUL_SYSTEM:
self.wndDragonSoul.HighlightSlot(inven_pos)


cseréld erre:
def Highligt_Item(self, inven_type, inven_pos):
if player.DRAGON_SOUL_INVENTORY == inven_type:
if app.ENABLE_DRAGON_SOUL_SYSTEM:
self.wndDragonSoul.HighlightSlot(inven_pos)
elif player.SLOT_TYPE_INVENTORY == inven_type:
self.wndInventory.HighlightSlot(inven_pos)


root ->uiInventory.py

A "class InventoryWindow(ui.ScriptWindow):" alá rögtön:
liHighlightedItems = []
Figyelj a tabulátorra, a többi mutatja, hogy nézzen ki.

Az egész "def OverInItem(self, overSlotPos):"-et erre cseréld:
def OverInItem(self, overSlotPos):
overSlotPosGlobal = self.__InventoryLocalSlotPosToGlobalSlotPos(overSlotPos)
self.wndItem.SetUsableItem(False)

if overSlotPosGlobal in self.liHighlightedItems:
self.liHighlightedItems.remove(overSlotPosGlobal)
self.wndItem.DeactivateSlot(overSlotPos)

if mouseModule.mouseController.isAttached():
attachedItemType = mouseModule.mouseController.GetAttachedType()
if player.SLOT_TYPE_INVENTORY == attachedItemType:

attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
attachedItemVNum = mouseModule.mouseController.GetAttachedItemIndex()

if self.__CanUseSrcItemToDstItem(attachedItemVNum, attachedSlotPos, overSlotPosGlobal):
self.wndItem.SetUsableItem(True)
self.ShowToolTip(overSlotPosGlobal)
return

self.ShowToolTip(overSlotPosGlobal)



Keress rá erre:
setItemVNum(i, itemVnum, itemCount)

alá rögtön:
if itemVnum == 0 and slotNumber in self.liHighlightedItems:
self.liHightlightedItems.remove(slotNumber)



Keress rá erre:
self.wndItem.DeactivateSlot(slotNumber)

cseréld erre:
else:
self.wndItem.DeactivateSlot(slotNumber)
self.__RefreshHighlights()



Ezeket valahova alulra illeszd be, arra figyelj, hogy a fájl végén legalább 1 telljesen üres enter legyen:
def HighlightSlot(self, slot):
if not slot in self.liHighlightedItems:
self.liHighlightedItems.append(slot)

def __RefreshHighlights(self):
for i in xrange(player.INVENTORY_PAGE_SIZE):
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(i)
if slotNumber in self.liHighlightedItems:
self.wndItem.ActivateSlot(i)


folyt.Köv.10-15 perc.
Azt hittem nem fér ki egy hozzászólásba :$
Szerver:

char.h
Keress rá erre:
void SetItem(TItemPos Cell, LPITEM item);

cseréld erre:
void SetItem(TItemPos Cell, LPITEM item, bool bWereMine = false);


char_item.cpp
Keress rá erre:
void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem)

cseréld erre:
void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem, bool bWereMine)


Keress rá erre:
pack.highlight = (Cell.window_type == DRAGON_SOUL_INVENTORY);

cseréld erre:
pack.highlight = !bWereMine || (Cell.window_type == DRAGON_SOUL_INVENTORY);


Keress rá erre:
SetItem(DestCell, item);

cseréld erre:
SetItem(DestCell, item, true);

input_db.cpp
Keress rá erre:
item->SetAttributes(p->aAttr);

Közvetlen alá:
item->SetLastOwnerPID(p->owner);

item.h
Keress rá erre:
DWORD GetLastOwnerPID() { return m_dwLastOwnerPID; }

Közvetlen alá:
void SetLastOwnerPID(DWORD pid) { m_dwLastOwnerPID = pid; }


item.cpp
Keress rá erre:
if (ch->GetDesc())

Közvetlen felé:
bool bWereMine = this->GetLastOwnerPID() == ch->GetPlayerID();


Keress rá erre:
ch->SetItem(TItemPos(window_type, pos), this);

Cseréld erre:
ch->SetItem(TItemPos(window_type, pos), this, bWereMine);


Ezzel kész is.
Ha bármi hiba lépett fel segítség topic-ban tedd fel kérdésed, és megpróbálok(unk) minél hamarabb választ találni a problémára!
További minden jót : T0gy3R

Szerk.:És amúgy csak a lényeg maradt le..Ezt az ETC mappába csomagold be."ymir work/ui/" elérésre a mappát is illetve a kép fájlt is
Szerk2.:Lemaradt az item.h.Köszi Ferenc.
Szerk3.:További rendszerekkel ez nem biztos, hogy teljes mértékben kompatibilis. Ezért felelősséget nem vállalok.!Ez a leírás működik, sokadszorra teszteltem. (2017.05.02). Illetve kép pótolva, mivel a kepfeltoltes.hu megszűnt.. :\

2017-05-02, 15:36:44 #1 Utolsó szerkesztés: 2018-08-12, 18:31:07 Szerző: T0gy3R
Sziasztok ismét.!
Most egy olyan leírást hoztam el a magyar közösségnek, ami szintén belenyúl az indító forrásba. Ez a "rendszer" a fegyverek/vértek/ékszerek/cipők/nyilak/sisakok ikonjának jobb alsó sarkába kiírja, hogy "+" értéke mennyi.
Biztonsági mentést csinálj mielőtt elkezded biztos ami nem biztos...
Itt egy kép esetleg annak, aki nem értené:


eterPythonLib->PythonSlotWindow.h
Keress rá erre:
CGraphicImageInstance * pInstance;
alá rögtön:
CGraphicImageInstance * pInstanceLevel;

Keress rá erre:
void Destroy();
alá rögtön:
void SetSlotLevelImage(DWORD dwIndex, CGraphicImage * levelImage);

eterPythonLib->PythonSlotWindow.cpp
Keress rá erre:
Slot.pFinishCoolTimeEffect = NULL;
alá rögtön:
Slot.pInstanceLevel = NULL;

Keresd meg a(z) "void CSlotWindow::SetSlotCount(DWORD dwIndex, DWORD dwCount)" eljárást
illeszd be alá ezt az eljárást:
void CSlotWindow::SetSlotLevelImage(DWORD dwIndex, CGraphicImage * levelImage)
{
TSlot * pSlot;
if (!GetSlotPointer(dwIndex, &pSlot) || !levelImage)
return;
assert(NULL == pSlot->pInstanceLevel);
pSlot->pInstanceLevel = CGraphicImageInstance::New();
pSlot->pInstanceLevel->SetDiffuseColor(1.0, 1.0, 1.0, 1.0);
pSlot->pInstanceLevel->SetImagePointer(levelImage);
}


keress rá erre:
pSlot->dwCenterSlotNumber = 0xffffffff;
alá rögtön:
if (pSlot->pInstanceLevel)
{
CGraphicImageInstance::Delete(pSlot->pInstanceLevel);
pSlot->pInstanceLevel = NULL;
}


keress rá erre:
if (rSlot.bActive)
felé:
if (rSlot.pInstanceLevel)
{
rSlot.pInstanceLevel->SetPosition(m_rect.left + rSlot.ixPosition, (m_rect.top + rSlot.iyPosition + rSlot.byyPlacedItemSize*ITEM_HEIGHT) - 32);
rSlot.pInstanceLevel->Render();
}


eterPythonLib->PythonWindowManagerModule.cpp
keress rá erre:
void initwndMgr()
felé:
PyObject * wndMgrSetSlotImage(PyObject * poSelf, PyObject * poArgs)
{
UI::CWindow * pWin;
if (!PyTuple_GetWindow(poArgs, 0, &pWin))
return Py_BuildException();

int iSlotIndex;
if (!PyTuple_GetInteger(poArgs, 1, &iSlotIndex))
return Py_BuildException();

char * szImagePath;
if (!PyTuple_GetString(poArgs, 2, &szImagePath))
return Py_BuildException();

if (!pWin->IsType(UI::CSlotWindow::Type()))
return Py_BuildException();

UI::CSlotWindow * pSlotWin = (UI::CSlotWindow *)pWin;
CGraphicImage * pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(szImagePath);
if (!pImage)
return Py_BuildException();
pSlotWin->SetSlotLevelImage(iSlotIndex, pImage);
return Py_BuildNone();
}


keress rá erre:
{ "ShowOverInWindowName", wndMgrShowOverInWindowName, METH_VARARGS },
alá rögtön:
{ "SetSlotLevelImage", wndMgrSetSlotImage, METH_VARARGS },


root->ui.py
keress rá erre:
wndMgr.SetSlotCount(self.hWnd, renderingSlotNumber, ItemCount)
alá rögtön:

itemName=item.GetItemName().strip()
itemNameP=item.GetItemName().rfind('+')
if itemNameP>0 and len(itemName)>itemNameP+1:
level=itemName[itemNameP+1:]
if level.isdigit():
wndMgr.SetSlotLevelImage(self.hWnd, renderingSlotNumber, ("icon/level/%d.tga"%int(level)))


Végül, pedig az icon.eix/epk kibontod, és az icon mappába, ezt belerakod

Ezzel kész is.



Ez nem befolyásolja a "rendszert"!!!! De bárkinek jól jöhet.
Ha szeretnéd, hogy a "+"-os fejlszetőknél is megjelenjen egy kis ikon akkor:
ui.py:
Keresd meg ezt az eljárást:
def SetItemSlot(self, renderingSlotNumber, ItemIndex, ItemCount = 0, diffuseColor = (1.0, 1.0, 1.0, 1.0)):
írd felül ezzel:

def SetItemSlot(self, renderingSlotNumber, ItemIndex, ItemCount = 0, diffuseColor = (1.0, 1.0, 1.0, 1.0)):
if 0 == ItemIndex or None == ItemIndex:
wndMgr.ClearSlot(self.hWnd, renderingSlotNumber)
return

item.SelectItem(ItemIndex)
itemIcon = item.GetIconImage()

item.SelectItem(ItemIndex)
(width, height) = item.GetItemSize()

wndMgr.SetSlot(self.hWnd, renderingSlotNumber, ItemIndex, width, height, itemIcon, diffuseColor)
wndMgr.SetSlotCount(self.hWnd, renderingSlotNumber, ItemCount)
itemName=item.GetItemName()##.strip()
itemNameP=item.GetItemName().rfind('+')
if itemNameP>0 and len(itemName)>itemNameP+1:
level=itemName[itemNameP+1:]
if level.isdigit():
wndMgr.SetSlotLevelImage(self.hWnd, renderingSlotNumber, ("icon/level/%d.tga"%int(level)))
else:
if len(itemName)==itemNameP+1:
wndMgr.SetSlotLevelImage(self.hWnd, renderingSlotNumber, ("icon/level/+.tga"))



kép:


Itt a kép fájl, ezt rakd a többi mellé

Ha bármi hiba lépett fel segítség topic-ban tedd fel kérdésed, és megpróbálok(unk) minél hamarabb választ találni a problémára!
További minden jót : T0gy3R

2017-05-13, 16:35:40 #2 Utolsó szerkesztés: 2017-05-18, 22:11:54 Szerző: T0gy3R
Sziasztok.!
Ismert az a hiba, hogy a karakter neve felett nem frissül megfelelően a szint.!
Biztonsági mentést csinálj mielőtt elkezded biztos ami nem biztos...
A fix:
UserInterface->InstanceBase.h
Keress rá erre:
    protected:
        DWORD                    m_dwDuelMode;
        DWORD                    m_dwEmoticonTime;

alá rögtön:
    public:
        DWORD GetLevel() const { return m_dwLevel; }
        void SetLevel(DWORD lvl);


UserInterface->InstanceBase.cpp
illeszd be a fájl aljára:
void CInstanceBase::SetLevel(DWORD lvl)
{
    m_dwLevel = lvl;
}


UserInterface->PythonPlayer.cpp
Keress rá erre:
        CInstanceBase* pkPlayer = NEW_GetMainActorPtr();

        if (pkPlayer)
            pkPlayer->UpdateTextTailLevel(lValue);

cseréld erre:
        CInstanceBase* pkPlayer = NEW_GetMainActorPtr();

        if (pkPlayer)
        {
            pkPlayer->UpdateTextTailLevel(lValue);
            pkPlayer->SetLevel(lValue);
        }




Ez még ezzel kapcsolatos, de nem kötelező:
a karakter neve felett "x lv"-t írt, forrásban, ezt itt tudjuk módosítani:
UserInterface->InstanceBaseEffect.cpp
Keress rá erre:
sprintf(szText, "Lv %d", level);
Itt a "Lv %d" felel az írásért. Csak a Lv-t írd át, a többit azt hagyd úgy.
pld.:
sprintf(szText, "%d Szintű ", level);




Ez még mindig ide tartozik, de továbbra sem kötelező a fix-hez:
Ha szeretnéd, hogy az adminjaidnak ne írja ki a szintjét, akkor a "void CInstanceBase::UpdateTextTailLevel(DWORD level)" eljárásod cseréld erre:
void CInstanceBase::UpdateTextTailLevel(DWORD level)
{
static D3DXCOLOR s_kGmLevelColor = D3DXCOLOR(254.0f/255.0f, 0.0f/255.0f, 0.0f/255.0f, 1.0f);
static D3DXCOLOR s_kLevelColor = D3DXCOLOR(152.0f/255.0f, 255.0f/255.0f, 51.0f/255.0f, 1.0f);

char szText[256];
if (IsPC())
{
sprintf(szText, "%d szint?", level);
CPythonTextTail::Instance().AttachLevel(GetVirtualID(), szText, s_kLevelColor);
}
if (IsGameMaster())
{
sprintf(szText, "<Admin> ");
CPythonTextTail::Instance().AttachLevel(GetVirtualID(), szText, s_kGmLevelColor);
}
}

végeredmény:
player:

Admin:



Továbbra sem a fix része, de egy remek ötlet.
A mob-oknak szintkijelzés:
UserInterface->PythonNonPlayer.h
Keress rá:
const char* GetMonsterName(DWORD dwVnum);
alá rögtön:
BYTE GetMobLevel(DWORD dwVnum);
UserInterface->PythonNonPlayer.cpp
Keress rá:
const char* CPythonNonPlayer::GetMonsterName(DWORD dwVnum)
Illeszd be alá ezt a függvényt: (A többi mutatja)
BYTE CPythonNonPlayer::GetMobLevel(DWORD dwVnum)
{
const CPythonNonPlayer::TMobTable * c_pTable = GetTable(dwVnum);
if (!c_pTable)
return 0;

return c_pTable->bLevel;
}


UserInterface->InstanceBase.cpp
keress rá:
m_dwLevel = c_rkCreateData.m_dwLevel;
Cseréld erre:
if (GetInstanceType() == CActorInstance::TYPE_ENEMY || GetInstanceType() == CActorInstance::TYPE_STONE)
m_dwLevel = CPythonNonPlayer::Instance().GetMobLevel(GetRace());
else
m_dwLevel = c_rkCreateData.m_dwLevel;


[spoiler=Ez csak akkor kell, ha a 2. kiegészítésemet is megcsináltad.]
UserInterface->InstanceBaseEffect.cpp
Az egész "void CInstanceBase::UpdateTextTailLevel(DWORD level)" eljárásod cseréld erre:
void CInstanceBase::UpdateTextTailLevel(DWORD level)
{
static D3DXCOLOR s_kLevelColor = D3DXCOLOR(152.0f / 255.0f, 255.0f / 255.0f, 51.0f / 255.0f, 1.0f);
static D3DXCOLOR s_kGmLevelColor = D3DXCOLOR(254.0f/255.0f, 0.0f/255.0f, 0.0f/255.0f, 1.0f);
static D3DXCOLOR s_kMobLevelColor = D3DXCOLOR(254.0f / 255.0f, 0.0f / 255.0f, 0.0f / 255.0f, 1.0f);


char szText[256];
if (IsPC())
{
sprintf(szText, "%d szintű ", level);
CPythonTextTail::Instance().AttachLevel(GetVirtualID(), szText, s_kLevelColor);
}
if (IsGameMaster())
{
sprintf(szText, "<Admin> ");
CPythonTextTail::Instance().AttachLevel(GetVirtualID(), szText, s_kGmLevelColor);
}
if (IsEnemy() || IsStone())
{
sprintf(szText, "%d szintű ", level);
CPythonTextTail::Instance().AttachLevel(GetVirtualID(), szText, s_kMobLevelColor);
}
}

[/spoiler]
végeredmény:


Ezzel kész is.
Ha bármi hiba lépett fel segítség topic-ban tedd fel kérdésed, és megpróbálok(unk) minél hamarabb választ találni a problémára!
További minden jót : T0gy3R
[spoiler=forrás]metin2dev, m2h. EPvP[/spoiler]
[spoiler]Nem szeretnék vitát azzal kapcsolatban, hogy ctrl+c, ctrl+v milyen egyszerű, meg google stb..Ezeket én azért csinálom, hogy esetleg akinek Ezekre szüksége van, az megtalálja itt is, a forumon. Köszönöm.[/spoiler]