- Mesaj
- 74
- Çözümler
- 4
- Beğeni
- 91
- Puan
- 669
- Ticaret Puanı
- 0
Merhaba arkadaşlar. Bugün bir Basit Sistem Yazma Rehberi paylaştım, burada da o rehberde yazdığım sistemi paylaşıyorum.
Envanter slotları ve yang bölümü arasına yeni bir buton koyuyoruz ve buraya sürükle-bırak yaptığımız item "Emin misin?" sorusuna verilen onayla birlikte siliniyor.
Not 1: Videoyla burada paylaşılan kodlar arasında tek satırlık bir fark mevcut. "mouseModule.mouseController.DeattachObject()" fonksiyonunu, son fonksiyonumdan alıp
ilk fonksiyonuma taşıdım. Böylelikle itemle butona tıklar tıklamaz mouse'a takılı kalan item görseli yok oluyor, evet / hayır dememizi beklemiyor.
Not 2: Videoda kullandığım butonun genişliği az olduğu ve estetik görünmediği için ufak bir düzenlemeyle oraya gelecek yeni bir buton hazırladım. Zip dosyasıyla birlikte bu konuya ekledim, görsel de bu şekilde:
Ekteki zip dosyasına "ymir work/ui/trashbutton" diziniyle birlikte TGA'ları yerleştirdim. trashbutton klasörünü, ETC packi içindeki ymir work/ui/ dizinine atarsanız, buton sağdaki örnekte olduğu gibi gözükecektir.
Envanter slotları ve yang bölümü arasına yeni bir buton koyuyoruz ve buraya sürükle-bırak yaptığımız item "Emin misin?" sorusuna verilen onayla birlikte siliniyor.
Not 1: Videoyla burada paylaşılan kodlar arasında tek satırlık bir fark mevcut. "mouseModule.mouseController.DeattachObject()" fonksiyonunu, son fonksiyonumdan alıp
ilk fonksiyonuma taşıdım. Böylelikle itemle butona tıklar tıklamaz mouse'a takılı kalan item görseli yok oluyor, evet / hayır dememizi beklemiyor.
Not 2: Videoda kullandığım butonun genişliği az olduğu ve estetik görünmediği için ufak bir düzenlemeyle oraya gelecek yeni bir buton hazırladım. Zip dosyasıyla birlikte bu konuya ekledim, görsel de bu şekilde:
Ekteki zip dosyasına "ymir work/ui/trashbutton" diziniyle birlikte TGA'ları yerleştirdim. trashbutton klasörünü, ETC packi içindeki ymir work/ui/ dizinine atarsanız, buton sağdaki örnekte olduğu gibi gözükecektir.
locale/tr/inventorywindow.py:
# BURAYI BUL:
"name" : "InventoryWindow",
## 600 - (width + 오른쪽으로 부터 띄우기 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'LARIN İÇİ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" :
(
## Inventory, 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",
},
root/uiinventory.py:
# root / uiinventory.py
## ARAT:
self.costumeButton = self.GetChild2("CostumeButton")
## ALTINA YAPIŞTIR:
self.trashButton = self.GetChild2("TrashButton")
# ARAT :
if self.costumeButton:
self.costumeButton.SetEvent(ui.__mem_func__(self.ClickCostumeButton))
# ALTINA YAPIŞTIR:
# (DİKKAT! TABLAMALARA DİKKAT ET, YAPIŞTIRACAĞIMIZ SATIRIN YUKARIDAKİ İF TANIMIYLA İLGİSİ YOK.
# YANİ BAŞINA ÜÇ DEĞİL, İKİ TAB BIRAKILACAK.)
self.trashButton.SetEvent(ui.__mem_func__(self.ClickTrashButton))
# ARAT:
self.mallButton = None
# ALTINA YAPIŞTIR:
self.trashButton = None
# ARAT:
def ClickMallButton(self):
print "click_mall_button"
net.SendChatPacket("/click_mall")
# ALTINA YAPIŞTIR:
def ClickTrashButton(self):
if mouseModule.mouseController.isAttached():
attachedType = mouseModule.mouseController.GetAttachedType()
attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
attachedItemSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()
mouseModule.mouseController.DeattachObject() #DeleteMyItem'den buraya tasidim, mouse'ta takili kalan itemi burda yok etmesi daha iyi.
self.questionDialog = uiCommon.QuestionDialog()
self.questionDialog.SetText("Silmek istediginden emin misin?")
self.questionDialog.SetAcceptEvent(ui.__mem_func__(self.DeleteMyItem))
self.questionDialog.SetCancelEvent(ui.__mem_func__(self.OnCloseQuestionDialog))
self.questionDialog.Open()
self.questionDialog.itempos = attachedItemSlotPos
def DeleteMyItem(self):
net.SendDeleteFromInventory(self.questionDialog.itempos)
self.OnCloseQuestionDialog()
UserInterface/Locale_inc.h:
//en son define'ın altına ekle:
#define TRASHBUTTON
UserInterface/Packet.h:
// HEADER_CG_....'ların 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
// ARAT:
typedef struct command_on_click
{
BYTE header;
DWORD vid;
} TPacketCGOnClick;
// ALTINA EKLE:
#ifdef TRASHBUTTON
typedef struct packet_delfrominv
{
BYTE header;
DWORD position;
} TPacketCGDelFromInv;
#endif
UserInterface/PythonNetworkStream.h:
// ARAT:
bool SendQuestConfirmPacket(BYTE byAnswer, DWORD dwPID);
// ALTINA YAPIŞTIR:
#ifdef TRASHBUTTON
// trash button
bool SendDeleteFromInvPacket(DWORD position);
#endif
UserInterface/PythonNetworkStreamModule.cpp:
// BU FONKSİYONU BUL:
PyObject* 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)
{
int iItemPos;
if (!PyTuple_GetInteger(poArgs, 0, &iItemPos))
return Py_BuildException();
CPythonNetworkStream& rns = CPythonNetworkStream::Instance();
rns.SendDeleteFromInvPacket(iItemPos);
return Py_BuildNone();
}
#endif
// ARAT:
{ "RegisterErrorLog", netRegisterErrorLog, METH_VARARGS },
// ALTINA YAPIŞTIR:
#ifdef TRASHBUTTON
{ "SendDeleteFromInventory", netSendDeleteFromInventory, METH_VARARGS },
#endif
UserInterface/PythonNetworkStreamPhaseGame.cpp:
// BU FONKSİYONU BUL:
bool CPythonNetworkStream::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)
{
TPacketCGDelFromInv kPacket;
kPacket.header = HEADER_CG_DELETEFROMINV;
kPacket.position = position;
if (!Send(sizeof(kPacket), &kPacket))
{
Tracen("SendDeleteFromInvPacket Error");
return false;
}
Tracef("SendDeleteFromInvPacket");
return SendSequence();
}
#endif
common/service.h:
// en son define'ın altına ekle:
#define TRASHBUTTON
game/src/input_main.cpp:
// CInputMain::Analyze(LPDESC d, BYTE bHeader, const char * 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 TPacketCGDelFromInv* 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 ekleyeceğiz,
// ö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;
DWORD vid;
} TPacketCGOnClick;
// ALTINA YAPIŞTIR:
#ifdef TRASHBUTTON
typedef struct packet_delfrominv
{
BYTE header;
DWORD position;
} TPacketCGDelFromInv;
#endif
game/src/packet_info.cpp:
// ARAT:
Set(HEADER_CG_ON_CLICK, sizeof(TPacketCGOnClick), "OnClick", true);
// ALTINA YAPIŞTIR:
#ifdef TRASHBUTTON
Set(HEADER_CG_DELETEFROMINV, sizeof(TPacketCGDelFromInv), "DelFromInv", true);
#endif