Jump to content

AZICKO

Management
  • Posts

    1510
  • Joined

  • Days Won

    13
  • Feedback

    100%

Everything posted by AZICKO

  1. AZICKO

    CH3HP DDoS

    Someone has their Discord Tag and Discord Account ID (you need to be in developer mode to retrieve it). I will associate it with the Pillory. # Topic's Merged
  2. Can you add an anti-virus / Virustotal scan, please?
  3. Pillory Updated Dark theme and possibility to search for duplicate accounts of a banned account. It makes the difference between a ban, a member flagged as a spammer and an anomaly on the account during the ban. Feedbacks forum deleted You can suggest ideas by private message, on the discord server or via ticket on the discord server. Disputes forum deleted From now on, a dispute must be sent by private message to all staff members or via ticket on the discord server.
  4. Yesterday was a special day... Warning Day! Please wear your sunglasses! I wrote a new pillory system in JS with DataTable. To be honest, I was lazy to keep the pillory up to date with the latest bans. Now, this new pillory directly queries Metin2 Dev's database. Unlike the old system, you can view all bans since the forum opened (except pardoned members). You will see several information there, member name, reasons for the ban (warnings issued by the staff), discord account id (if the member had synchronized it) and finally, the date of the last warning. Moderators no longer need to warn the member and create a topic in the pillory. From now on, in case of banishment, they will warn the member several times according to the most serious reasons (Reselling, Scamming, Leaking...). Many Metin2 Dev sellers have already asked me if a potential customer was suspicious. From now on, you will be able to search and filter the results according to the information contained in the pillory. Pillory => https://metin2.dev/pillory.php I also wrote a new system to search for members within the community. You can search for a member by several criteria: Metin2 Dev ID, Metin2 Dev Name, Discord ID or Discord Tag. If the member you are looking for is banned from our community, a link to the pillory will be available to view the reasons for the ban. The goal is to improve the accessibility of information about toxic members (Reseller, Scammer, Leaker...) of the Metin2 community and to protect our members from these dishonest members. Search => https://metin2.dev/search.php All information displayed is already public.
  5. Deleted Pillory Marketplace custom sorting fixed Addition of a block of information on the risks incurred with dishonest members within the Marketplace
  6. MySQL 8 is good, but... You need to modify some SQL queries (wrap some column names) in Metin2 sources to be compatible with MySQL 8, and password function.
  7. Premium forum => Is read-only Deletion scheduled => 1 August 2022
  8. Added Drafts forum in Temporary category This forum allows you to create draft topics without being visible to other members of the community.
  9. This fixes several issues : Unable to destroy an item from the Dragon Soul Inventory A second dialog box appears asking for confirmation before destroying the item When you give yourself any stackable item and split the stack, you can drop the splitted stack in correct amounts, but you cannot destroy a splitted stack, you will always be forced to destroy the whole stack Client/Local_inc.h Add : #define M2_FEATURE_DESTROY_ITEM Client/Packet.h Add : #ifdef M2_FEATURE_DESTROY_ITEM HEADER_CG_ITEM_DESTROY = 21, #endif Add : #ifdef M2_FEATURE_DESTROY_ITEM typedef struct command_item_destroy { BYTE header; TItemPos pos; BYTE count; } TPacketCGItemDestroy; #endif Client/PythonApplicationModule.cpp Add : #ifdef M2_FEATURE_DESTROY_ITEM PyModule_AddIntConstant(poModule, "M2_FEATURE_DESTROY_ITEM", 1); #else PyModule_AddIntConstant(poModule, "M2_FEATURE_DESTROY_ITEM", 0); #endif Client/PythonNetworkStream.h Add : #ifdef M2_FEATURE_DESTROY_ITEM bool SendItemDestroyPacket(TItemPos pos, DWORD count); #endif Client/PythonNetworkStramModule.cpp Add : #ifdef M2_FEATURE_DESTROY_ITEM PyObject* netSendItemDestroyPacket(PyObject* poSelf, PyObject* poArgs) { TItemPos Cell; int count; switch (PyTuple_Size(poArgs)) { case 2: if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell)) return Py_BuildException(); if (!PyTuple_GetInteger(poArgs, 1, &count)) return Py_BuildException(); break; case 3: if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type)) return Py_BuildException(); if (!PyTuple_GetInteger(poArgs, 1, &Cell.cell)) return Py_BuildException(); if (!PyTuple_GetInteger(poArgs, 2, &count)) return Py_BuildException(); break; default: return Py_BuildException(); } CPythonNetworkStream& rkNetStream = CPythonNetworkStream::Instance(); rkNetStream.SendItemDestroyPacket(Cell, count); return Py_BuildNone(); } #endif Add : #ifdef M2_FEATURE_DESTROY_ITEM { "SendItemDestroyPacket", netSendItemDestroyPacket, METH_VARARGS }, #endif Client/PythonNetworkStreamPhaseGameItem.cpp Add : #ifdef M2_FEATURE_DESTROY_ITEM bool CPythonNetworkStream::SendItemDestroyPacket(TItemPos pos, DWORD count) { if (!__CanActMainInstance()) return true; TPacketCGItemDestroy itemDestroyPacket; itemDestroyPacket.header = HEADER_CG_ITEM_DESTROY; itemDestroyPacket.pos = pos; itemDestroyPacket.count = count; if (!Send(sizeof(itemDestroyPacket), &itemDestroyPacket)) { Tracen("SendItemDestroyPacket Error"); return false; } return SendSequence(); } #endif Server/service.h Add : #define M2_FEATURE_DESTROY_ITEM Server/char_item.cpp Add : #ifdef M2_FEATURE_DESTROY_ITEM bool CHARACTER::DestroyItem(TItemPos Cell, BYTE bCount) { LPITEM item = NULL; if (!CanHandleItem()) { if (NULL != DragonSoul_RefineWindow_GetOpener()) ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°*È*âÀ» ¿¬ »óÅ¿¡¼*´Â ¾ÆÀÌÅÛÀ» ¿Å±æ ¼ö ¾ø½À´Ï´Ù.")); return false; } if (IsDead()) return false; if (!IsValidItemPosition(Cell) || !(item = GetItem(Cell))) return false; if (item->IsExchanging()) return false; if (true == item->isLocked()) return false; if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true) return false; if (item->GetCount() <= 0) return false; if (bCount == 0 || bCount > item->GetCount()) bCount = item->GetCount(); SyncQuickslot(QUICKSLOT_TYPE_ITEM, Cell.cell, 255); if (bCount == item->GetCount()) { item->RemoveFromCharacter(); } else { if (bCount == 0) { if (test_server) sys_log(0, "[DROP_ITEM] drop item count == 0"); return false; } item->SetCount(item->GetCount() - bCount); ITEM_MANAGER::instance().FlushDelayedSave(item); } ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You destroyed: %d x %s."), bCount, item->GetName()); return true; } #endif Server/input.h Add : #ifdef M2_FEATURE_DESTROY_ITEM void ItemDestroy(LPCHARACTER ch, const char* data); #endif Server/char.h Add : #ifdef M2_FEATURE_DESTROY_ITEM bool DestroyItem(TItemPos Cell, BYTE bCount = 0); #endif Server/input_main.cpp Add : #ifdef M2_FEATURE_DESTROY_ITEM case HEADER_CG_ITEM_DESTROY: if (!ch->IsObserverMode()) ItemDestroy(ch, c_pData); break; #endif Add : #ifdef M2_FEATURE_DESTROY_ITEM void CInputMain::ItemDestroy(LPCHARACTER ch, const char* data) { struct command_item_destroy* pinfo = (struct command_item_destroy*)data; if (ch) ch->DestroyItem(pinfo->Cell, pinfo->count); } #endif Server/packet.h Add : #ifdef M2_FEATURE_DESTROY_ITEM HEADER_CG_ITEM_DESTROY = 21, #endif Add : #ifdef M2_FEATURE_DESTROY_ITEM typedef struct command_item_destroy { BYTE header; TItemPos Cell; BYTE count; } TPacketCGItemDestroy; #endif Server/packet_info.cpp Add : #ifdef M2_FEATURE_DESTROY_ITEM Set(HEADER_CG_ITEM_DESTROY, sizeof(TPacketCGItemDestroy), "ItemDestroy", true); #endif Client/game.py Add : if app.M2_FEATURE_DESTROY_ITEM: def __SendDestroyItemPacket(self, itemVNum, itemCount, itemInvenType = player.INVENTORY): if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) return net.SendItemDestroyPacket(itemInvenType, itemVNum, itemCount) return Add : if app.M2_FEATURE_DESTROY_ITEM: def RequestDestroyItem(self, answer): if not self.itemDropQuestionDialog: return if answer: ## Question Text questionText = "Are you really sure?" ## Dialog itemDropQuestionDialog2 = uiCommon.QuestionDialog() itemDropQuestionDialog2.SetText(questionText) itemDropQuestionDialog2.SetAcceptEvent(lambda arg=True: self.RequestDestroyItemConfirm(arg)) itemDropQuestionDialog2.SetCancelEvent(lambda arg=False: self.RequestDestroyItemConfirm(arg)) itemDropQuestionDialog2.Open() itemDropQuestionDialog2.dropType = self.itemDropQuestionDialog.dropType itemDropQuestionDialog2.dropNumber = self.itemDropQuestionDialog.dropNumber itemDropQuestionDialog2.dropCount = self.itemDropQuestionDialog.dropCount self.itemDropQuestionDialog2 = itemDropQuestionDialog2 self.itemDropQuestionDialog.Close() self.itemDropQuestionDialog = None constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0) def RequestDestroyItemConfirm(self, answer): if not self.itemDropQuestionDialog2: return if answer: dropType = self.itemDropQuestionDialog2.dropType dropNumber = self.itemDropQuestionDialog2.dropNumber dropCount = self.itemDropQuestionDialog2.dropCount if player.SLOT_TYPE_INVENTORY == dropType: if dropNumber == player.ITEM_MONEY: return else: self.__SendDestroyItemPacket(dropNumber, dropCount) elif player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == dropType: self.__SendDestroyItemPacket(dropNumber, dropCount, player.DRAGON_SOUL_INVENTORY) self.itemDropQuestionDialog2.Close() self.itemDropQuestionDialog2 = None constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(0) Full __DropItem : def __DropItem(self, attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount): # PRIVATESHOP_DISABLE_ITEM_DROP - 개인상점 열고 있는 동안 아이템 버림 방지 if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) return # END_OF_PRIVATESHOP_DISABLE_ITEM_DROP if player.SLOT_TYPE_INVENTORY == attachedType and player.IsEquipmentSlot(attachedItemSlotPos): self.stream.popupWindow.Close() self.stream.popupWindow.Open(localeInfo.DROP_ITEM_FAILURE_EQUIP_ITEM, 0, localeInfo.UI_OK) else: if player.SLOT_TYPE_INVENTORY == attachedType: dropItemIndex = player.GetItemIndex(attachedItemSlotPos) item.SelectItem(dropItemIndex) dropItemName = item.GetItemName() ## Question Text questionText = localeInfo.HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, attachedItemCount) ## Dialog if app.M2_FEATURE_DESTROY_ITEM: itemDropQuestionDialog = uiCommon.QuestionDialogItem() else: itemDropQuestionDialog = uiCommon.QuestionDialog() itemDropQuestionDialog.SetText(questionText) itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg)) if app.M2_FEATURE_DESTROY_ITEM: itemDropQuestionDialog.SetDestroyEvent(lambda arg=TRUE: self.RequestDestroyItem(arg)) itemDropQuestionDialog.SetCancelEvent(lambda arg=False: self.RequestDropItem(arg)) itemDropQuestionDialog.Open() itemDropQuestionDialog.dropType = attachedType itemDropQuestionDialog.dropNumber = attachedItemSlotPos itemDropQuestionDialog.dropCount = attachedItemCount self.itemDropQuestionDialog = itemDropQuestionDialog constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(1) elif player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedType: dropItemIndex = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, attachedItemSlotPos) item.SelectItem(dropItemIndex) dropItemName = item.GetItemName() ## Question Text questionText = localeInfo.HOW_MANY_ITEM_DO_YOU_DROP(dropItemName, attachedItemCount) ## Dialog if app.M2_FEATURE_DESTROY_ITEM: itemDropQuestionDialog = uiCommon.QuestionDialogItem() else: itemDropQuestionDialog = uiCommon.QuestionDialog() itemDropQuestionDialog.SetText(questionText) itemDropQuestionDialog.SetAcceptEvent(lambda arg=True: self.RequestDropItem(arg)) if app.M2_FEATURE_DESTROY_ITEM: itemDropQuestionDialog.SetDestroyEvent(lambda arg=TRUE: self.RequestDestroyItem(arg)) itemDropQuestionDialog.SetCancelEvent(lambda arg=False: self.RequestDropItem(arg)) itemDropQuestionDialog.Open() itemDropQuestionDialog.dropType = attachedType itemDropQuestionDialog.dropNumber = attachedItemSlotPos itemDropQuestionDialog.dropCount = attachedItemCount self.itemDropQuestionDialog = itemDropQuestionDialog constInfo.SET_ITEM_QUESTION_DIALOG_STATUS(1)
  10. You should modify the Alpha channel of the DDS file.
  11. I had suggested the first method, then deleted my answer. With the first method, I can no longer sell items to an NPC.
  12. I did this, I think we can do even more optimized. I tried : ACMD(do_emotion_allow) { if ( ch->GetArena() ) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·ÃÀå¿¡¼­ »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù.")); return; } char arg1[256]; one_argument(argument, arg1, sizeof(arg1)); if (!*arg1) return; uint32_t val = 0; str_to_number(val, arg1); #ifdef M2_FEATURE_NOTICE_EMOTION LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(val); if (tch) { bool bFrom = !(s_emotion_set.find(std::make_pair(ch->GetVID(), val)) == s_emotion_set.end()); bool bTo = !(s_emotion_set.find(std::make_pair(val, ch->GetVID())) == s_emotion_set.end()); if (bFrom && bTo) { ch->ChatPacket(CHAT_TYPE_INFO, "You are currently sharing emotions with your partner! <3"); return; } if (!bFrom && bTo) { s_emotion_set.insert(std::make_pair(ch->GetVID(), val)); ch->ChatPacket(CHAT_TYPE_INFO, "You allowed emotions with %s.", tch->GetName()); tch->ChatPacket(CHAT_TYPE_INFO, "%s allowed to share emotions.", ch->GetName()); return; } if (bFrom) { ch->ChatPacket(CHAT_TYPE_INFO, "You have already asked to share emotions with %s...", tch->GetName()); ch->ChatPacket(CHAT_TYPE_INFO, "Don't anger your partner and be patient!"); return; } else { s_emotion_set.insert(std::make_pair(ch->GetVID(), val)); ch->ChatPacket(CHAT_TYPE_INFO, "You asked to share emotions with %s.", tch->GetName()); tch->ChatPacket(CHAT_TYPE_INFO, "%s requested to share emotions with you.", ch->GetName()); return; } } #else s_emotion_set.insert(std::make_pair(ch->GetVID(), val)); #endif }
  13. C++ Version In: cmd_emotion.cpp (game source) Add: #include "config.h" Find: ACMD(do_emotion_allow) { [...] } Replace like this: ACMD(do_emotion_allow) { if ( ch->GetArena() ) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("´ë·ÃÀå¿¡¼­ »ç¿ëÇÏ½Ç ¼ö ¾ø½À´Ï´Ù.")); return; } #ifdef M2_FEATURE_NOTICE_EMOTION if (thecore_heart->pulse - (int32_t)ch->GetLastShoutPulse() < passes_per_sec * 15) { ch->ChatPacket(CHAT_TYPE_INFO, "Please, stop spam!"); return; } ch->SetLastShoutPulse(thecore_heart->pulse); #endif char arg1[256]; one_argument(argument, arg1, sizeof(arg1)); if (!*arg1) return; uint32_t val = 0; str_to_number(val, arg1); s_emotion_set.insert(std::make_pair(ch->GetVID(), val)); #ifdef M2_FEATURE_NOTICE_EMOTION LPCHARACTER tch = CHARACTER_MANAGER::instance().Find(val); if (tch) { tch->ChatPacket(CHAT_TYPE_INFO, "%s requested the use of emotions with you %s", ch->GetName(), tch->GetName()); } #endif } And add define in your service.h or similar: #define M2_FEATURE_NOTICE_EMOTION
  14. IP Board Upgrade IPS 4.7.0 (Stable Build) Hide Link And Code Upgrade to 3.3.3 (From 3.1.0)
  15. Duplicate posts (warns, topics, PM's...) are resolved 2FA re-enabled IP Board Upgrade IPS 4.7.0 Beta 10 (Dev Build)
  16. Migrating NGINX to Apache2 + FastCGI with PHP 8.1.7 (It should be temporary) @ Syreldar Kekw
  17. Migration to a new server completed... DNS zone update in progress... PHP 7.4.26 => PHP 8.1.7 MariaDB 10.5.12 => MariaDB 10.5.15 IPS 4.6.12.1 (Stable Build) => IPS 4.7.0 (Dev Build) Websites Server metin2.dev metin2dev.org funky-emu.net Cache is rebuilding, all maintenance tasks are running...
  18. Migration to a new server completed... DNS zone update in progress... PHP 7.3 => PHP 8.1 Storage Server img.funky-emu.net dl.funky-emu.net img.metin2.dev metin2.download metin2.top top-metin2.org top-dofus.fr download.dofedex.com funky-emulation.com
  19. Migration to a new server completed... DNS zone update in progress... PHP 7.3 => PHP 8.1
  20. Migration to a new server completed... DNS zone update in progress... PHP 7.3 => PHP 8.1
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.