
Ekteki klasörde bulunan trashbutton klasörünü, ETC packi içindeki ymir work/ui/ dizinine atarsanız, buton örnekte olduğu gibi gözükecektir.
Spoyler: Pack
# BURAYI BUL:
"name" : "InventoryWindow",
## 600 - (##dth + 오른쪽으로 부터 띄우기 24 px)
"x" : SCREEN_WIDTH - 176,
"y" : SCREEN_HEIGHT - 37 - 565,
"style" : ("movable", "float",),
"width" : 176,
"height" : 565,
# BU ŞEKİLDE DEĞİŞTİR:
"name" : "InventoryWindow",
## 600 - (width + 오른쪽으로 부터 띄우기 24 px## "x" : SCREEN_WIDTH - 176,
"y" : SCREEN_HEIGHT - 37 - 565 - 19,
"style" : ("movable", "float",),
"width" : 176,
"height" : 565 + 19,
## DÜZENLEDİĞİMİZ BÖLÜMÜN HEMEN ALTINDAKİ, CHILDREN'LARI##İÇİNDE EN TEPEDE OLANI, BUNU BUL:
"children" :
(
## Inventory, Equipment Slots
{
"name" : "board"## "type" : "board",
"style" : ("attach",),
"x" : 0,
"y" : 0,
"width" : 176,
"height" : 565,
## BU ŞEKİLDE DEĞİŞTİR:
"children" :
(
## ##ventory, Equipment Slots
{
"name" : "board",
## "type" : "board",
"style" : ("attach",),
"x" : 0,
"y" : 0,
"width" : 176,
"height" : 565 + 19,
## BU KISMI BUL:
## Item Slot
{
## "name" : "ItemSlot",
## "type" : "grid_table",
"x" : 8,
"y" : 246,
"start_index" : 0,
"x_count" : 5,
"y_count" : 9,
"x_step" : 32,
"y_step" : 32,
"image" : "d:/ymir work/ui/public/Slot_Base.sub"
},
## EN SONDAKİ VİRGÜLDEN HEMEN SONRA BİR ALT SATIRA GEÇ VE BUNU YAPIŞTIR:
##
## Trash Button
{
"name" : "TrashButton",
## "type" : "button",
"x" : 8,
"y" : 246 + 289,
"default_image" : "d:/ymir work/ui/trashbutton/trashbutton_up.tga",
"over_image" : "d:/ymir work/ui/trashbutton/trashbutton_hover.tga",
"down_image" : "d:/ymir work/ui/trashbutton/trashbutton_down.tga",
},
Spoyler: Client Source
UserInterface/Locale_inc.h::
//en son define'ın altına ekle:
#define TRASHBUTTON
UserInterface/Packet.h::
// HEADER_CG_...#define bittiği yere, HEADER_GC'lere geçmeden bunu ekle:
// örnek olarak, benimki şu satırın hemen altında:
// HEADER_CG_HANDSHAKE = 0xff,
#ifdef TRASHBUTTON
HEADER_CG_DELETEFROMINV = 220,
#endif
// A#ifdefypedef struct command_on_click
{
BYTE header;
DWORD [HASH=3]#endif[/HASH];
} TPacketCGOnClick;
// ALTINA EKLE:
#ifdef TRASHBUTTON
typedef struct packet_delfrominv
{
BYTE header;
DWORD position;#ifdefcketCGDelFromInv;
#endif
UserInterface/PythonNetworkStream.h::
// ARAT:
bool Se#endiftConfirmPacket(BYTE byAnswer, DWORD dwPID);
// ALTINA YAPIŞTIR:
#ifdef TRASHBUTTON
// trash button
bool SendDeleteFromInvPacket(DWORD posit#ifdef#endif
UserInterface/PythonNetworkStreamModule.cpp::
// BU FONKSİYONU #endifPyObject* netSendSelectItemPacket(PyObject* poSelf, PyObject* poArgs)
{
/*...fonksiyon içeriği...*/
}
// FONKSİYON BİTTİKTEN SONRA BİR ALT SATIRA GEÇ VE YAPIŞTIR:
#ifdef TRASHBUTTON
PyObject* netSendDeleteFromInventory(PyObject* poSelf, PyObject* poArgs)
{
in#ifdefmPos;
if (!PyTuple_GetInteger(poArgs, 0, &iItemPos))
return Py_BuildException();
CPythonNetworkStream& rns = CPythonNetworkStream::Instance();
rns.SendDeleteFromInvPacket(iItemPos);
return Py_BuildNone();
}
#endif
// ARAT:
{ "RegisterErrorLog", netRegisterErrorLog, #endif METH_VARARGS },
// ALTINA YAPIŞTIR:
#ifdef TRASHBUTTON
{ "SendDeleteFromInventory", netSendDeleteFromInven#ifdef METH_VARARGS },
#endif
UserInterface/PythonNetworkStreamPhaseGame.cpp::
// BU FONKSİYONU BUL:
bo#endifthonNetworkStream::SendQuestConfirmPacket(BYTE byAnswer, DWORD dwPID)
{
/*..fonksiyon içeriği..*/
}
// FONKSİYON BİTTİKTEN SONRA BİR ALT SATIRA GEÇ VE YAPIŞTIR:
#ifdef TRASHBUTTON
bool CPythonNetworkStream::SendDeleteFromInvPacket(DWORD position)
{
TPacketCGDelFromIn#ifdefket;
kPacket.header = HEADER_CG_DELETEFROMINV;
kPacket.position = position;
if (!Send(sizeof(kPacket), &kPacket))
{
Tracen("SendDeleteFromInvPacket Error");
return false;
}
Tracef("SendDeleteFromInvPacket");
return SendSequence();
}#endif
Spoyler: Server Game Src
common/service.h::
// en son define'ın altına ekle:
#define TRASHBUTTON
game/src/input_main.cpp::
// CInputMain::Analyze(LPDESC d, BYTE bHeader,#definechar * c_pData) fonksiyonu
// içinde, şunu bul:
case HEADER_CG_PONG:
Pong(d);
break;
// ÜSTÜNE YAPIŞTIR:
#ifdef TRASHBUTTON
case HEADER_CG_DELETEFROMINV:
if (ch)
{
const TPac#ifdefelFromInv* p = reinterpret_cast<const TPacketCGDelFromInv*>(c_pData);
TItemPos Cell(INVENTORY, p->position);
LPITEM itemToDelete = ch->GetItem(Cell);
if (itemToDelete != NULL)
{
if (Cell.IsEquipPosition())
{
ch->ChatPacket(CHAT_TYPE_INFO, "Hayir.");
/*"Giyilen itemi silemezsin" uyarisi bu.*/
}
else
{
itemToDelete->RemoveFromCharacter();
}
}
}
break;
#endif
game/src/packet.h::
// yine HEADER_CG...'ların en sonuna, GC'lere geçmeden bir satır ekley[HASH=3]#endif[/HASH],
// örnek olarak benimki şu satırın altında:
// HEADER_CG_CLIENT_VERSION2 = 0xf1,
#ifdef TRASHBUTTON
HEADER_CG_DELETEFROMINV = 220,
#endif
// ARAT:
typedef struct command_on_click
{
BYTE header;
[HASH=2]#ifdef[/HASH]RD vid;
} TPacketCGOnClick;
// ALTINA YAPIŞT#endiffdef TRASHBUTTON
typedef struct packet_delfrominv
{
BYTE header;
DWORD position;
} TPacketCGDelFromInv;
#endif
#ifdef title="game/src/packet_info.cpp:"]// ARAT:
Set(HEADER_CG_ON_CLICK, sizeof(TPacketCGOnClick), "OnClick",#endif;
// ALTINA YAPIŞTIR#ifdef TRASHBUTTON
Set(HEADER_CG_DELETEFROMINV, sizeof(TPacketCGDelFromInv), "DelFromInv", true);#endif
[/CODE]
İNDİR
VİRUSTOTAL