Beiträge von Yiv

    Was haben immer alle mit ihrem RAM ?(


    Ein gut laufender Root braucht gute CPU Leistung und eine Core-Aufteilung, die diese maximal ausnutzt. Bei einem vCore (was normalerweise ein Thread eines CPU's ist, also nichtmal ein Kern) würde das heissen: 1 Channel & 1 Core.
    Das sollte auch ohne Probleme reichen um ohne Kicks/Lags testen zu können...


    MfG

    Guten Abend,


    da LeNnT meint, Teile meines Codes in seinen Produkten, die er verkauft, verwenden zu müssen, habe ich mich nun dazu entschlossen, das ganze zu publizieren.


    Das Release bewirkt, dass Items, welche ihr neu erhaltet, im Inventar markiert werden (wie ein aktivierter Auto-Pott).



    Einbau


    1. Client-Source
    Datei: PythonSlotWindow.h (EterPythonLib)
    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. CAniImageBox * m_pSlotActiveEffect;


    Code
    1. CAniImageBox* m_apSlotActiveEffect[3];


    Datei: PythonSlotWindow.cpp (EterPythonLib)
    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. if (!m_pSlotActiveEffect)


    Code
    1. if (!m_apSlotActiveEffect[0] ||
    2. !m_apSlotActiveEffect[1] ||
    3. !m_apSlotActiveEffect[2])


    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. if (m_pSlotActiveEffect)
    2. m_pSlotActiveEffect->Update();


    Code
    1. for (int i = 0; i < 3; ++i)
    2. if (m_apSlotActiveEffect[i])
    3. m_apSlotActiveEffect[i]->Update();


    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. if (rSlot.bActive)
    2. if (m_pSlotActiveEffect)
    3. {
    4. int ix = m_rect.left + rSlot.ixPosition;
    5. int iy = m_rect.top + rSlot.iyPosition;
    6. m_pSlotActiveEffect->SetPosition(ix, iy);
    7. m_pSlotActiveEffect->Render();
    8. }



    Das 1. suchen und mit dem 2. ersetzen:



    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. if (m_pSlotActiveEffect)
    2. {
    3. delete m_pSlotActiveEffect;
    4. m_pSlotActiveEffect = NULL;
    5. }


    Code
    1. for (int i = 0; i < 3; ++i)
    2. {
    3. if (m_apSlotActiveEffect[i])
    4. {
    5. delete m_apSlotActiveEffect[i];
    6. m_apSlotActiveEffect[i] = NULL;
    7. }
    8. }


    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. m_pSlotActiveEffect = NULL;


    Code
    1. for (int i = 0; i < 3; ++i)
    2. m_apSlotActiveEffect[i] = NULL;



    2. Client
    Datei: interfaceModule.py
    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. def Highligt_Item(self, inven_type, inven_pos):
    2. if player.DRAGON_SOUL_INVENTORY == inven_type:
    3. if app.ENABLE_DRAGON_SOUL_SYSTEM:
    4. self.wndDragonSoul.HighlightSlot(inven_pos)


    Code
    1. def Highligt_Item(self, inven_type, inven_pos):
    2. if player.DRAGON_SOUL_INVENTORY == inven_type:
    3. if app.ENABLE_DRAGON_SOUL_SYSTEM:
    4. self.wndDragonSoul.HighlightSlot(inven_pos)
    5. elif player.SLOT_TYPE_INVENTORY == inven_type:
    6. self.wndInventory.HighlightSlot(inven_pos)


    Datei: uiInventory.py
    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. class InventoryWindow(ui.ScriptWindow):


    Code
    1. class InventoryWindow(ui.ScriptWindow):
    2. liHighlightedItems = []


    Das 1. suchen und mit dem 2. ersetzen:



    Die Methode InventoryWindow.RefreshBagSlotWindow(self) wie folgt anpassen:


    Der Klasse InventoryWindow folgende Methoden hinzufügen:

    Code
    1. def HighlightSlot(self, slot):
    2. if not slot in self.liHighlightedItems:
    3. self.liHighlightedItems.append(slot)
    4. def __RefreshHighlights(self):
    5. for i in xrange(player.INVENTORY_PAGE_SIZE):
    6. slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(i)
    7. if slotNumber in self.liHighlightedItems:
    8. self.wndItem.ActivateSlot(i)



    3. Server-Source (Game)
    Datei: char.h
    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. void SetItem(TItemPos Cell, LPITEM item);


    Code
    1. void SetItem(TItemPos Cell, LPITEM item, bool bWereMine = false);


    Datei: char_item.cpp
    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem)


    Code
    1. void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem, bool bWereMine)


    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. pack.highlight = (Cell.window_type == DRAGON_SOUL_INVENTORY);


    Code
    1. pack.highlight = !bWereMine || (Cell.window_type == DRAGON_SOUL_INVENTORY);


    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. SetItem(DestCell, item);


    Code
    1. SetItem(DestCell, item, true);


    Datei: input_db.cpp
    Der Methode CInputDB::ItemLoad(LPDESC d, const char * c_pData) folgendes hinzufügen:


    Datei: item.h
    Das 1. suchen und mit dem 2. ersetzen:

    Code
    1. DWORD GetLastOwnerPID() { return m_dwLastOwnerPID; }


    Code
    1. void SetLastOwnerPID(DWORD pid) { m_dwLastOwnerPID = pid; }
    2. DWORD GetLastOwnerPID() { return m_dwLastOwnerPID; }


    Datei: item.cpp
    Der Methode CItem::AddToCharacter(LPDESC d, const char * c_pData) folgendes hinzufügen:





    Die Dateien (Bitte melden Sie sich an, um diesen Link zu sehen.) in bspw. das ETC Archiv packen in das Verzeichnis D:/ymir work/ui/


    Special Thanks geht hierbei an Souza, da er mich dazu gebracht hat, das ganze zu schreiben.


    RE-Releases erlaubt und ERWÜNSCHT, solange meine Credits bestehen bleiben!


    MfG

    Liebe Community,


    da ich gestern Geburtstag hatte, allerdings schenke ich heute euch etwas :3 Ich denke die Uhrzeit gerade sagt alles über das Release aus :P


    Das ganze ist ein kleines Wertigkeits-System, das anhand der Bonis des Ausrüstungsgegenstandes die Wertigkeit dessens berechnet und dem Tool-Tip einen entsprechenden Wertigkeits-Titel hinzufügt.


    Bitte melden Sie sich an, um dieses Bild zu sehen.Bitte melden Sie sich an, um dieses Bild zu sehen.Bitte melden Sie sich an, um dieses Bild zu sehen.



    Der Einbau:
    Ihr öffnet die Datei uiToolTip.py.
    Sucht nun nach der Klasse ItemToolTip.
    Dort fügt ihr noch ganz am Anfang diese Listen hinzu (Bitte melden Sie sich an, um diesen Link zu sehen.):


    Anschließend sucht ihr nach der Funktion AddItemData.
    Fast ganz am Anfang, unter

    Code
    1. self.__AdjustMaxWidth(attrSlot, itemDesc)

    fügt ihr folgendes hinzu:



    Anpassungen:
    In der Liste VALENCE_ITEM_TITLES könnt ihr die Item-Wertigkeits-Titel anpassen, wobei jeder Eintrag folgendermaßen aufgebaut sein muss:

    Code
    1. [Benötigte Punkte, Titel, Farbe]


    Wichtig ist zu beachten, dass die Liste nach den benötigten Punkten aufsteigend sortiert sein muss!


    In der Liste VALENCE_BONUS_LIST müssen nun die Werte aller Bonis, die in der Tabelle item_attr in der player-Datenbank eingetragen sind, eingetragen werden (nur die unterschiedlichen Stufen, also falls ihr bspw. 500, 500, 1000, 1000, 1500 habt, dann müsst ihr nur 500, 1000 und 1500 eintragen).


    Die Liste VALENCE_BONUS_LIST_SPECIAL muss genauso angepasst werden, nur, dass hier die Bonis der item_attr_rare eingetragen werden (6./7. Bonus).


    Falls ihr keine 6./7. Bonis habt, dann müsst ihr bzw. solltet ihr nach points = points / player.ATTRIBUTE_SLOT_MAX_NUM suchen und das zu dem abändern points = points / (player.ATTRIBUTE_SLOT_MAX_NUM - 2).


    Mit freundlichen Grüßen
    Yiv

    Liebe Community,


    da ich von demjenigen, für den ich den Code erstellt habe, gebeten hat, diesen zu releasen, release ich hiermit eine kleine InGame-Sidebar, die mit ein wenig Python-Kentnisse leicht erweiterbar ist.


    Ihr müsst lediglich folgendes erledigen, damit ihr sie nutzen könnt:
    game.py:
    Oben bei den anderen import's folgendes hinzufügen:

    Code
    1. import uisidebar


    Nun in der __init__-Funktion der GameWindow-Klasse folgendes hinzufügen (einfach am Ende adden):

    Code
    1. self.sideBar = uisidebar.SideBar()
    2. self.sideBar.Show()


    In der Close-Funktion:

    Code
    1. self.sideBar.Destroy()
    2. self.sideBar = None


    Nun könnt ihr über folgende Funktion der neuen SideBar-Klasse Buttons hinzufügen:

    Code
    1. self.sideBar.AddButton(<display text>, <event>)


    Am Beispiel eines Buttons, der es erlaubt, Screenshots zu machen:

    Code
    1. self.sideBar.AddButton("Screenshot", self.SaveScreen)


    Mit freundlichen Grüßen
    Yiv

    Dateien

    • uisidebar.py

      (2,46 kB, 66 Mal heruntergeladen, zuletzt: )

    Liebe Community,


    hier ein kurzes Release für die Anzeige des Monster-Levels vor dem Monster Namen, wie es nun auf Metin2.DE auch ist (Patchnotes: Bitte melden Sie sich an, um diesen Link zu sehen.)


    Bitte melden Sie sich an, um dieses Bild zu sehen.


    PythonNonPlayer.h:
    Unter der Methode GetMonsterName, folgendes einfügen:

    C
    1. BYTE GetMobLevel(DWORD dwVnum);



    PythonNonPlayer.cpp:
    Folgendes einfach unten hinzufügen:

    C
    1. BYTE CPythonNonPlayer::GetMobLevel(DWORD dwVnum)
    2. {
    3. const CPythonNonPlayer::TMobTable * c_pTable = GetTable(dwVnum);
    4. if (!c_pTable)
    5. return 0;
    6. return c_pTable->bLevel;
    7. }



    InstanceBase.cpp:
    Nach folgendem suchen:

    C
    1. m_dwLevel = c_rkCreateData.m_dwLevel;


    Durch das hier ersetzen:

    C
    1. if (GetInstanceType() == CActorInstance::TYPE_ENEMY)
    2. m_dwLevel = CPythonNonPlayer::Instance().GetMobLevel(GetRace());
    3. else
    4. m_dwLevel = c_rkCreateData.m_dwLevel;



    Mit freundlichen Grüßen
    Yiv

    Guten Tag,


    ich veröffentliche hier eine kleine Funktionalität, welche für den ein oder anderen vielleicht nützlich ist.


    Was kann man damit machen?
    Ihr könnt mithilfe dieser Kleinigkeit, ein Item erstellen, für welches die Informationen (Vnum, Anzahl, Sockets, ...) auf einem anderem Game-Core liegen, als der, auf dem es erstellt werden soll.


    Um das ganze einzubauen, benötigt ihr den Source der Game- und des DB-Cores!
    Erstellt ein Backup, falls ihr nicht genau wisst, was ihr da tut.




    Zum Einbau:
    1. Öffnet die service.h ("common"-Ordner) und fügt folgende #define-Direktive hinzu:

    Code
    1. // Enables function for giving items cross core
    2. #define __GIVE_ITEM_CROSS_CORE__


    2. Öffnet die tables.h ("common"-Ordner) und fügt folgende Header für die Game-DB-Core-Kommunikation hinzu:


    3. Fügt der Item-Manager-Klasse die Methode GiveItemCrossCore hinzu.
    Öffnet dazu die Datei item_manager.h (Game-Core-Source) und hängt unter der Methode GetSpecialGroupFromItem folgendes an:

    Code
    1. #ifdef __GIVE_ITEM_CROSS_CORE__
    2. void GiveItemCrossCore(TPlayerItem* pkItem);
    3. #endif


    Öffnet nun noch die Datei item_manager.cpp (Game-Core-Source) und fügt ganz unten folgendes hinzu:


    4. Öffnet die Datei ClientManager.cpp (DB-Core-Source) und fügt in das switch-Statement in der Methode ProcessPackets der Klasse ClientManager ("void CClientManager::ProcessPackets(CPeer * peer)" suchen) folgenden case-Block ein:

    Code
    1. #ifdef __GIVE_ITEM_CROSS_CORE__
    2. case HEADER_GD_GIVE_ITEM_CROSS_CORE:
    3. GiveItemCrossCore(((TPlayerItem*)data));
    4. break;
    5. #endif


    5. Öffnet die ClientManager.h Datei (DB-Core-Source) und fügt der ClientManager-Klasse die Methode GiveItemCrossCore hinzu. Kopiert dazu einfach unter die Methode BlockChat folgendes:

    Code
    1. #ifdef __GIVE_ITEM_CROSS_CORE__
    2. void GiveItemCrossCore(TPlayerItem* pkItem);
    3. #endif


    Öffnet nun die Datei ClientManager.cpp (DB-Core-Source) und hängt das an:


    6. Öffnet die input_db.cpp (Game-Core-Source) und fügt in das switch-Statement in der Methode Analyze der InputDB-Klasse ("int CInputDB::Analyze(LPDESC d, BYTE bHeader, const char * c_pData)" suchen) diesen case-Block ein:

    Code
    1. #ifdef __GIVE_ITEM_CROSS_CORE__
    2. case HEADER_DG_GIVE_ITEM_CROSS_CORE:
    3. GiveItemCrossCore(((TPlayerItem*)c_pData));
    4. #endif


    7. Öffnet nun noch die input.h Datei (Game-Core-Source) und fügt der InputDB-Klasse folgende Methode hinzu:

    Code
    1. #ifdef __GIVE_ITEM_CROSS_CORE__
    2. void GiveItemCrossCore(TPlayerItem* pkItemInfo);
    3. #endif


    Zu guter letzt hängt ihr nun noch an die Datei input_db.cpp (Game-Core-Source) folgendes an:




    Nun könnt ihr bspw. so ein Item Core-übergreifend erstellen:



    Was ihr nun damit anstellt, ist eure Sache. :)


    Mit freundlichen Grüßen
    Yiv

    Liebe Community,


    da ich gerade 'nen Server angespielt habe und mich wiedermal gestört hat, dass es Ewigkeiten dauert Yang-Bomben aufzuheben und ich das vor einiger Zeit bereits mal geändert habe, erkläre ich hier kurz, wie man die Zeit zwischen 2 Aufhebe-Vorgängen verkürzen oder entfernen kann.


    PythonPlayer.cpp:
    In der SendClickItemPacket Methode der Klasse CPythonPlayer findet ihr relativ weit oben folgendes:

    Code
    1. static DWORD s_dwNextTCPTime = 0;
    2. DWORD dwCurTime=ELTimer_GetMSec();
    3. if (dwCurTime >= s_dwNextTCPTime)
    4. {
    5. s_dwNextTCPTime=dwCurTime + 500;


    Nun könnt ihr entweder in der untersten Zeile die Wartezeit (aktuell 500) verändern (Angabe in Millisekunden).


    Oder ihr entfernt diesen Code-Teil komplett (ganz unten die schließende Klammer des if-Statements nicht vergessen) und entfernt die Wartezeit somit komplett.


    Mit freundlichen Grüßen
    Yiv