scf1ntap
Inactive Member-
Posts
9 -
Joined
-
Last visited
-
Feedback
0%
About scf1ntap

Recent Profile Visitors
The recent visitors block is disabled and is not being shown to other users.
scf1ntap's Achievements
-
Bug item_award from ItemShop purchase
scf1ntap replied to scf1ntap's topic in Community Support - Questions & Answers
So i need change the logic from ClientManager? -
Bug item_award from ItemShop purchase
scf1ntap replied to scf1ntap's topic in Community Support - Questions & Answers
In item_proto i have ITEM_USE USE_SPECIAL And what about the costumes, pets, mounts?..As soon as I open the Item Shop storage, it disappears instantly... I don't even get the chance to put the mouse on it -
Bug item_award from ItemShop purchase
scf1ntap replied to scf1ntap's topic in Community Support - Questions & Answers
Yuup, sorry, it was the old version without extended, i have the extended item award But i have in CommonDefines.h not in service.h..its a problem this? // Define: #define ENABLE_EXTEND_ITEM_AWARD #ifdef ENABLE_EXTEND_ITEM_AWARD #define USE_ITEM_AWARD_CHECK_ATTRIBUTES // c++11 or higher #endif #include "stdafx.h" #include "../../common/CommonDefines.h" #include "../../common/billing.h" #include "../../common/building.h" #include "../../common/VnumHelper.h" #include "../../libgame/include/grid.h" #include "ClientManager.h" #include "Main.h" #include "Config.h" #include "DBManager.h" #include "QID.h" #include "GuildManager.h" #include "PrivManager.h" #include "MoneyLog.h" #include "ItemAwardManager.h" #include "Marriage.h" #include "Monarch.h" #include "ItemIDRangeManager.h" #include "Cache.h" #include <sstream> #include <fmt/fmt.h> void CClientManager::QUERY_SAFEBOX_LOAD(CPeer * pkPeer, DWORD dwHandle, TSafeboxLoadPacket * packet, bool bMall) { ClientHandleInfo * pi = new ClientHandleInfo(dwHandle); strlcpy(pi->safebox_password, packet->szPassword, sizeof(pi->safebox_password)); pi->account_id = packet->dwID; pi->account_index = 0; pi->ip[0] = bMall ? 1 : 0; strlcpy(pi->login, packet->szLogin, sizeof(pi->login)); char szQuery[QUERY_MAX_LEN]; snprintf(szQuery, sizeof(szQuery), "SELECT account_id, size, password FROM safebox%s WHERE account_id=%u", GetTablePostfix(), packet->dwID); if (g_log) sys_log(0, "HEADER_GD_SAFEBOX_LOAD (handle: %d account.id %u is_mall %d)", dwHandle, packet->dwID, bMall ? 1 : 0); CDBManager::instance().ReturnQuery(szQuery, QID_SAFEBOX_LOAD, pkPeer->GetHandle(), pi); } void CClientManager::RESULT_SAFEBOX_LOAD(CPeer * pkPeer, SQLMsg * msg) { CQueryInfo * qi = (CQueryInfo *) msg->pvUserData; ClientHandleInfo * pi = (ClientHandleInfo *) qi->pvData; DWORD dwHandle = pi->dwHandle; if (pi->account_index == 0) { char szSafeboxPassword[SAFEBOX_PASSWORD_MAX_LEN + 1]; strlcpy(szSafeboxPassword, pi->safebox_password, sizeof(szSafeboxPassword)); TSafeboxTable * pSafebox = new TSafeboxTable; memset(pSafebox, 0, sizeof(TSafeboxTable)); SQLResult * res = msg->Get(); if (res->uiNumRows == 0) { if (strcmp("000000", szSafeboxPassword)) { pkPeer->EncodeHeader(HEADER_DG_SAFEBOX_WRONG_PASSWORD, dwHandle, 0); #ifdef METGUIDE_ENABLE_SAFEBOX_MEMORY_LEAK_FIX delete pSafebox; #endif delete pi; return; } } else { MYSQL_ROW row = mysql_fetch_row(res->pSQLResult); if (((!row[2] || !*row[2]) && strcmp("000000", szSafeboxPassword)) || ((row[2] && *row[2]) && strcmp(row[2], szSafeboxPassword))) { pkPeer->EncodeHeader(HEADER_DG_SAFEBOX_WRONG_PASSWORD, dwHandle, 0); #ifdef METGUIDE_ENABLE_SAFEBOX_MEMORY_LEAK_FIX delete pSafebox; #endif delete pi; return; } if (!row[0]) pSafebox->dwID = 0; else str_to_number(pSafebox->dwID, row[0]); if (!row[1]) pSafebox->bSize = 0; else str_to_number(pSafebox->bSize, row[1]); /* if (!row[3]) pSafebox->dwGold = 0; else pSafebox->dwGold = atoi(row[3]); */ if (pi->ip[0] == 1) { pSafebox->bSize = 1; sys_log(0, "MALL id[%d] size[%d]", pSafebox->dwID, pSafebox->bSize); } else sys_log(0, "SAFEBOX id[%d] size[%d]", pSafebox->dwID, pSafebox->bSize); } if (0 == pSafebox->dwID) pSafebox->dwID = pi->account_id; pi->pSafebox = pSafebox; char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "SELECT id, `window`+0, pos, count, vnum, socket0, socket1, socket2, " "attrtype0, attrvalue0, " "attrtype1, attrvalue1, " "attrtype2, attrvalue2, " "attrtype3, attrvalue3, " "attrtype4, attrvalue4, " "attrtype5, attrvalue5, " "attrtype6, attrvalue6 " "FROM item%s WHERE owner_id=%d AND `window`='%s'", GetTablePostfix(), pi->account_id, pi->ip[0] == 0 ? "SAFEBOX" : "MALL"); pi->account_index = 1; CDBManager::instance().ReturnQuery(szQuery, QID_SAFEBOX_LOAD, pkPeer->GetHandle(), pi); } else { if (!pi->pSafebox) { sys_err("null safebox pointer!"); delete pi; return; } if (!msg->Get()->pSQLResult) { sys_err("null safebox result"); delete pi; return; } static std::vector<TPlayerItem> s_items; CreateItemTableFromRes(msg->Get()->pSQLResult, &s_items, pi->account_id); std::set<TItemAward *> * pSet = ItemAwardManager::instance().GetByLogin(pi->login); if (pSet && !m_vec_itemTable.empty()) { CGrid grid(5, MAX(1, pi->pSafebox->bSize) * 9); bool bEscape = false; for (DWORD i = 0; i < s_items.size(); ++i) { TPlayerItem & r = s_items[i]; itertype(m_map_itemTableByVnum) it = m_map_itemTableByVnum.find(r.vnum); if (it == m_map_itemTableByVnum.end()) { bEscape = true; sys_err("invalid item vnum %u in safebox: login %s", r.vnum, pi->login); break; } grid.Put(r.pos, 1, it->second->bSize); } if (!bEscape) { std::vector<std::pair<DWORD, DWORD> > vec_dwFinishedAwardID; typeof(pSet->begin()) it = pSet->begin(); char szQuery[512]; while (it != pSet->end()) { TItemAward * pItemAward = *(it++); const DWORD& dwItemVnum = pItemAward->dwVnum; if (pItemAward->bTaken) continue; if (pi->ip[0] == 0 && pItemAward->bMall) continue; if (pi->ip[0] == 1 && !pItemAward->bMall) continue; itertype(m_map_itemTableByVnum) it = m_map_itemTableByVnum.find(pItemAward->dwVnum); if (it == m_map_itemTableByVnum.end()) { sys_err("invalid item vnum %u in item_award: login %s", pItemAward->dwVnum, pi->login); continue; } TItemTable * pItemTable = it->second; int iPos; if ((iPos = grid.FindBlank(1, it->second->bSize)) == -1) break; TPlayerItem item; memset(&item, 0, sizeof(TPlayerItem)); DWORD dwSocket2 = pItemAward->dwSocket2; #ifdef ENABLE_EXTEND_ITEM_AWARD dwSocket2 = pItemAward->dwSocket2; #endif if (pItemTable->bType == ITEM_UNIQUE) { #ifdef ENABLE_EXTEND_ITEM_AWARD // 12.04.2019 - Correction for unique items based on the real time. const auto lValue0 = pItemTable->alValues[ITEM_SOCKET_REMAIN_SEC]; const auto lValue2 = pItemTable->alValues[ITEM_SOCKET_UNIQUE_REMAIN_TIME]; const auto tNow = CClientManager::instance().GetCurrentTime(); dwSocket2 = (lValue2 == 0) ? static_cast<DWORD>(lValue0) : static_cast<DWORD>(tNow + lValue0); #else if (pItemAward->dwSocket2 != 0) dwSocket2 = pItemAward->dwSocket2; else dwSocket2 = pItemTable->alValues[0]; #endif } else if ((dwItemVnum == 50300 || dwItemVnum == 70037) && pItemAward->dwSocket0 == 0) { #ifndef ENABLE_EXTEND_ITEM_AWARD DWORD dwSkillIdx; DWORD dwSkillVnum; do { dwSkillIdx = number(0, m_vec_skillTable.size()-1); dwSkillVnum = m_vec_skillTable[dwSkillIdx].dwVnum; break; } while (1); pItemAward->dwSocket0 = dwSkillVnum; #endif } else { switch (dwItemVnum) { case 72723: case 72724: case 72725: case 72726: case 72727: case 72728: case 72729: case 72730: case 76004: case 76005: case 76021: case 76022: case 79012: case 79013: if (pItemAward->dwSocket2 == 0) { dwSocket2 = pItemTable->alValues[0]; } else { dwSocket2 = pItemAward->dwSocket2; } break; } } if (GetItemID () > m_itemRange.dwMax) { sys_err("UNIQUE ID OVERFLOW!!"); break; } { itertype(m_map_itemTableByVnum) it = m_map_itemTableByVnum.find (dwItemVnum); if (it == m_map_itemTableByVnum.end()) { sys_err ("Invalid item(vnum : %d). It is not in m_map_itemTableByVnum.", dwItemVnum); continue; } TItemTable* item_table = it->second; if (item_table == NULL) { sys_err ("Invalid item_table (vnum : %d). It's value is NULL in m_map_itemTableByVnum.", dwItemVnum); continue; } if (0 == pItemAward->dwSocket0) { for (int i = 0; i < ITEM_LIMIT_MAX_NUM; i++) { if (LIMIT_REAL_TIME == item_table->aLimits[i].bType) { if (0 == item_table->aLimits[i].lValue) pItemAward->dwSocket0 = time(0) + 60 * 60 * 24 * 7; else pItemAward->dwSocket0 = time(0) + item_table->aLimits[i].lValue; break; } else if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[i].bType || LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[i].bType) { if (0 == item_table->aLimits[i].lValue) pItemAward->dwSocket0 = 60 * 60 * 24 * 7; else pItemAward->dwSocket0 = item_table->aLimits[i].lValue; break; } } } #ifdef ENABLE_EXTEND_ITEM_AWARD ItemAwardManager::instance().CheckItemCount(*pItemAward, *pItemTable); ItemAwardManager::instance().CheckItemSocket(*pItemAward, *pItemTable); ItemAwardManager::instance().CheckItemBlend(*pItemAward, *pItemTable); ItemAwardManager::instance().CheckItemAddonType(*pItemAward, *pItemTable); ItemAwardManager::instance().CheckItemSkillBook(*pItemAward, m_vec_skillTable); #ifdef USE_ITEM_AWARD_CHECK_ATTRIBUTES ItemAwardManager::instance().CheckItemAttributes(*pItemAward, *pItemTable, m_vec_itemAttrTable, m_vec_itemRareTable); #endif // START_OF_AUTO_QUERY char szColumns[QUERY_MAX_LEN], szValues[QUERY_MAX_LEN]; auto iLen = snprintf(szColumns, sizeof(szColumns), "id, owner_id, `window`, pos, vnum, count"); auto iValueLen = snprintf(szValues, sizeof(szValues), "%u, %u, '%s', %d, %u, %u", GainItemID(), pi->account_id, (pi->ip[0] == 0) ? "SAFEBOX" : "MALL", iPos, pItemAward->dwVnum, pItemAward->dwCount); iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", socket0, socket1, socket2"); iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen, ", %u, %u, %u", pItemAward->dwSocket0, pItemAward->dwSocket1, dwSocket2); for (auto i = 0; i < ITEM_ATTRIBUTE_MAX_NUM; ++i) { iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", attrtype%d, attrvalue%d", i, i); iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen, ", %d, %d", pItemAward->aAttr[i].bType, pItemAward->aAttr[i].sValue); } // END_OF_AUTO_QUERY snprintf(szQuery, sizeof(szQuery), "INSERT INTO item%s (%s) VALUES(%s)", GetTablePostfix(), szColumns, szValues); #else snprintf(szQuery, sizeof(szQuery), "INSERT INTO item%s (id, owner_id, `window`, pos, vnum, count, socket0, socket1, socket2) " "VALUES(%u, %u, '%s', %d, %u, %u, %u, %u, %u)", GetTablePostfix(), GainItemID(), pi->account_id, pi->ip[0] == 0 ? "SAFEBOX" : "MALL", iPos, pItemAward->dwVnum, pItemAward->dwCount, pItemAward->dwSocket0, pItemAward->dwSocket1, dwSocket2); #endif } auto pmsg(CDBManager::instance().DirectQuery(szQuery)); SQLResult * pRes = pmsg->Get(); sys_log(0, "SAFEBOX Query : [%s]", szQuery); if (pRes->uiAffectedRows == 0 || pRes->uiInsertID == 0 || pRes->uiAffectedRows == (uint32_t)-1) break; item.id = pmsg->Get()->uiInsertID; item.window = pi->ip[0] == 0 ? SAFEBOX : MALL, item.pos = iPos; item.count = pItemAward->dwCount; item.vnum = pItemAward->dwVnum; item.alSockets[0] = pItemAward->dwSocket0; item.alSockets[1] = pItemAward->dwSocket1; item.alSockets[2] = dwSocket2; #ifdef ENABLE_EXTEND_ITEM_AWARD memcpy(&item.aAttr, pItemAward->aAttr, sizeof(item.aAttr)); #endif s_items.emplace_back(item); vec_dwFinishedAwardID.emplace_back(pItemAward->dwID, item.id); grid.Put(iPos, 1, it->second->bSize); } for (DWORD i = 0; i < vec_dwFinishedAwardID.size(); ++i) ItemAwardManager::instance().Taken(vec_dwFinishedAwardID[i].first, vec_dwFinishedAwardID[i].second); } } pi->pSafebox->wItemCount = s_items.size(); pkPeer->EncodeHeader(pi->ip[0] == 0 ? HEADER_DG_SAFEBOX_LOAD : HEADER_DG_MALL_LOAD, dwHandle, sizeof(TSafeboxTable) + sizeof(TPlayerItem) * s_items.size()); pkPeer->Encode(*pi->pSafebox); if (!s_items.empty()) pkPeer->Encode(s_items); delete pi; } } -
Bug item_award from ItemShop purchase
scf1ntap replied to scf1ntap's topic in Community Support - Questions & Answers
This is my ClientManager, maybe because i have the vnum for elixirs there? void CClientManager::RESULT_SAFEBOX_LOAD(CPeer * pkPeer, SQLMsg * msg) { CQueryInfo * qi = (CQueryInfo *) msg->pvUserData; ClientHandleInfo * pi = (ClientHandleInfo *) qi->pvData; DWORD dwHandle = pi->dwHandle; // 여기에서 사용하는 account_index는 쿼리 순서를 말한다. // 첫번째 패스워드 알아내기 위해 하는 쿼리가 0 // 두번째 실제 데이터를 얻어놓는 쿼리가 1 if (pi->account_index == 0) { char szSafeboxPassword[SAFEBOX_PASSWORD_MAX_LEN + 1]; strlcpy(szSafeboxPassword, pi->safebox_password, sizeof(szSafeboxPassword)); TSafeboxTable * pSafebox = new TSafeboxTable; memset(pSafebox, 0, sizeof(TSafeboxTable)); SQLResult * res = msg->Get(); if (res->uiNumRows == 0) { if (strcmp("000000", szSafeboxPassword)) { pkPeer->EncodeHeader(HEADER_DG_SAFEBOX_WRONG_PASSWORD, dwHandle, 0); delete pi; return; } } else { MYSQL_ROW row = mysql_fetch_row(res->pSQLResult); // 비밀번호가 틀리면.. if (((!row[2] || !*row[2]) && strcmp("000000", szSafeboxPassword)) || ((row[2] && *row[2]) && strcmp(row[2], szSafeboxPassword))) { pkPeer->EncodeHeader(HEADER_DG_SAFEBOX_WRONG_PASSWORD, dwHandle, 0); delete pi; return; } if (!row[0]) pSafebox->dwID = 0; else str_to_number(pSafebox->dwID, row[0]); if (!row[1]) pSafebox->bSize = 0; else str_to_number(pSafebox->bSize, row[1]); /* if (!row[3]) pSafebox->dwGold = 0; else pSafebox->dwGold = atoi(row[3]); */ if (pi->ip[0] == 1) { pSafebox->bSize = 1; sys_log(0, "MALL id[%d] size[%d]", pSafebox->dwID, pSafebox->bSize); } else sys_log(0, "SAFEBOX id[%d] size[%d]", pSafebox->dwID, pSafebox->bSize); } if (0 == pSafebox->dwID) pSafebox->dwID = pi->account_id; pi->pSafebox = pSafebox; char szQuery[512]; snprintf(szQuery, sizeof(szQuery), "SELECT id, window+0, pos, count, vnum, socket0, socket1, socket2, " "attrtype0, attrvalue0, " "attrtype1, attrvalue1, " "attrtype2, attrvalue2, " "attrtype3, attrvalue3, " "attrtype4, attrvalue4, " "attrtype5, attrvalue5, " "attrtype6, attrvalue6 " "FROM item%s WHERE owner_id=%d AND window='%s'", GetTablePostfix(), pi->account_id, pi->ip[0] == 0 ? "SAFEBOX" : "MALL"); pi->account_index = 1; CDBManager::instance().ReturnQuery(szQuery, QID_SAFEBOX_LOAD, pkPeer->GetHandle(), pi); } else { if (!pi->pSafebox) { sys_err("null safebox pointer!"); delete pi; return; } // 쿼리에 에러가 있었으므로 응답할 경우 창고가 비어있는 것 처럼 // 보이기 때문에 창고가 아얘 안열리는게 나음 if (!msg->Get()->pSQLResult) { sys_err("null safebox result"); delete pi; return; } static std::vector<TPlayerItem> s_items; CreateItemTableFromRes(msg->Get()->pSQLResult, &s_items, pi->account_id); std::set<TItemAward *> * pSet = ItemAwardManager::instance().GetByLogin(pi->login); if (pSet && !m_vec_itemTable.empty()) { CGrid grid(5, MAX(1, pi->pSafebox->bSize) * 9); bool bEscape = false; for (DWORD i = 0; i < s_items.size(); ++i) { TPlayerItem & r = s_items[i]; itertype(m_map_itemTableByVnum) it = m_map_itemTableByVnum.find(r.vnum); if (it == m_map_itemTableByVnum.end()) { bEscape = true; sys_err("invalid item vnum %u in safebox: login %s", r.vnum, pi->login); break; } grid.Put(r.pos, 1, it->second->bSize); } if (!bEscape) { std::vector<std::pair<DWORD, DWORD> > vec_dwFinishedAwardID; typeof(pSet->begin()) it = pSet->begin(); char szQuery[512]; while (it != pSet->end()) { TItemAward * pItemAward = *(it++); const DWORD& dwItemVnum = pItemAward->dwVnum; if (pItemAward->bTaken) continue; if (pi->ip[0] == 0 && pItemAward->bMall) continue; if (pi->ip[0] == 1 && !pItemAward->bMall) continue; itertype(m_map_itemTableByVnum) it = m_map_itemTableByVnum.find(pItemAward->dwVnum); if (it == m_map_itemTableByVnum.end()) { sys_err("invalid item vnum %u in item_award: login %s", pItemAward->dwVnum, pi->login); continue; } TItemTable * pItemTable = it->second; int iPos; if ((iPos = grid.FindBlank(1, it->second->bSize)) == -1) break; TPlayerItem item; memset(&item, 0, sizeof(TPlayerItem)); DWORD dwSocket2 = 0; if (pItemTable->bType == ITEM_UNIQUE) { if (pItemAward->dwSocket2 != 0) dwSocket2 = pItemAward->dwSocket2; else dwSocket2 = pItemTable->alValues[0]; } else if ((dwItemVnum == 50300 || dwItemVnum == 70037) && pItemAward->dwSocket0 == 0) { DWORD dwSkillIdx; DWORD dwSkillVnum; do { dwSkillIdx = number(0, m_vec_skillTable.size()-1); dwSkillVnum = m_vec_skillTable[dwSkillIdx].dwVnum; if (!dwSkillVnum > 120) continue; break; } while (1); pItemAward->dwSocket0 = dwSkillVnum; } else { switch (dwItemVnum) { case 72723: case 72724: case 72725: case 72726: case 72727: case 72728: case 72729: case 72730: // 무시무시하지만 이전에 하던 걸 고치기는 무섭고... // 그래서 그냥 하드 코딩. 선물 상자용 자동물약 아이템들. case 76004: case 76005: case 76021: case 76022: case 79012: case 79013: if (pItemAward->dwSocket2 == 0) { dwSocket2 = pItemTable->alValues[0]; } else { dwSocket2 = pItemAward->dwSocket2; } break; } } if (GetItemID () > m_itemRange.dwMax) { sys_err("UNIQUE ID OVERFLOW!!"); break; } { itertype(m_map_itemTableByVnum) it = m_map_itemTableByVnum.find (dwItemVnum); if (it == m_map_itemTableByVnum.end()) { sys_err ("Invalid item(vnum : %d). It is not in m_map_itemTableByVnum.", dwItemVnum); continue; } TItemTable* item_table = it->second; if (item_table == NULL) { sys_err ("Invalid item_table (vnum : %d). It's value is NULL in m_map_itemTableByVnum.", dwItemVnum); continue; } if (0 == pItemAward->dwSocket0) { for (int i = 0; i < ITEM_LIMIT_MAX_NUM; i++) { if (LIMIT_REAL_TIME == item_table->aLimits[i].bType) { if (0 == item_table->aLimits[i].lValue) pItemAward->dwSocket0 = time(0) + 60 * 60 * 24 * 7; else pItemAward->dwSocket0 = time(0) + item_table->aLimits[i].lValue; break; } else if (LIMIT_REAL_TIME_START_FIRST_USE == item_table->aLimits[i].bType || LIMIT_TIMER_BASED_ON_WEAR == item_table->aLimits[i].bType) { if (0 == item_table->aLimits[i].lValue) pItemAward->dwSocket0 = 60 * 60 * 24 * 7; else pItemAward->dwSocket0 = item_table->aLimits[i].lValue; break; } } } snprintf(szQuery, sizeof(szQuery), "INSERT INTO item%s (id, owner_id, window, pos, vnum, count, socket0, socket1, socket2) " "VALUES(%u, %u, '%s', %d, %u, %u, %u, %u, %u)", GetTablePostfix(), GainItemID(), pi->account_id, pi->ip[0] == 0 ? "SAFEBOX" : "MALL", iPos, pItemAward->dwVnum, pItemAward->dwCount, pItemAward->dwSocket0, pItemAward->dwSocket1, dwSocket2); } std::auto_ptr<SQLMsg> pmsg(CDBManager::instance().DirectQuery(szQuery)); SQLResult * pRes = pmsg->Get(); sys_log(0, "SAFEBOX Query : [%s]", szQuery); if (pRes->uiAffectedRows == 0 || pRes->uiInsertID == 0 || pRes->uiAffectedRows == (uint32_t)-1) break; item.id = pmsg->Get()->uiInsertID; item.window = pi->ip[0] == 0 ? SAFEBOX : MALL, item.pos = iPos; item.count = pItemAward->dwCount; item.vnum = pItemAward->dwVnum; item.alSockets[0] = pItemAward->dwSocket0; item.alSockets[1] = pItemAward->dwSocket1; item.alSockets[2] = dwSocket2; s_items.push_back(item); vec_dwFinishedAwardID.push_back(std::make_pair(pItemAward->dwID, item.id)); grid.Put(iPos, 1, it->second->bSize); } for (DWORD i = 0; i < vec_dwFinishedAwardID.size(); ++i) ItemAwardManager::instance().Taken(vec_dwFinishedAwardID[i].first, vec_dwFinishedAwardID[i].second); } } pi->pSafebox->wItemCount = s_items.size(); pkPeer->EncodeHeader(pi->ip[0] == 0 ? HEADER_DG_SAFEBOX_LOAD : HEADER_DG_MALL_LOAD, dwHandle, sizeof(TSafeboxTable) + sizeof(TPlayerItem) * s_items.size()); pkPeer->Encode(pi->pSafebox, sizeof(TSafeboxTable)); if (!s_items.empty()) pkPeer->Encode(&s_items[0], sizeof(TPlayerItem) * s_items.size()); delete pi; } } -
Bug item_award from ItemShop purchase
scf1ntap replied to scf1ntap's topic in Community Support - Questions & Answers
I have this Extended Item Award -
Dear community, as I found out that there's an error in player.item_award (or not directly in it but the function of it) I wanted to ask if someone already fixed it? The error works as following: I have an issue with my Itemshop. When I purchase an elixir, costume, pet, or mount, the socket2 value in the item_award table is correctly populated with the value0 from item_proto (for example, the elixir has 10 million HP). However, problems occur when I withdraw them from the ItemShop Mall (Depot) to my inventory: • Elixirs: When I activate the elixir, it disappears immediately as soon as I take damage. • Costumes/Mounts/Pets: These disappear instantly upon withdrawal. I noticed that when items are purchased via the Itemshop, their sockets appear as 0,0,0 on the server. However, if I create the exact same item using the GM command, the sockets appear correctly (e.g., 0,0,10000000). If nobody fixed it maybe someone could fix it? Regards
-
up
-
Up
-
Hello, I have in the game source a title that offers 20k pv, I would like to change it to set the MAX PV to 150k for the German duel, not to offer pv but to set 150k pv on char.cpp i have this if (item->GetVnum() == 39377 && (GetMapIndex() != 61 && GetMapIndex() != 63 && GetMapIndex() != 72)) return; else if (item->GetVnum() == 39377 && (GetMapIndex() == 61 || GetMapIndex() == 63 || GetMapIndex() == 72)) { CAffect* pAffect1 = FindAffect(AFFECT_BOOST_PV); CAffect* pAffect2 = FindAffect(AFFECT_BOOST_CAST); if (!pAffect1) AddAffect(AFFECT_BOOST_PV, POINT_MAX_HP, 120000, 0, 60*60*60*365, 0, true); if (!pAffect2) AddAffect(AFFECT_BOOST_CAST, POINT_CASTING_SPEED, -20, 0, 60*60*60*365, 0, true); } DWORD iTitle = item->GetValue(1); SetPoint(POINT_TITLE, iTitle); ComputePoints(); PointsPacket(); UpdatePacket(); } How could I have it set my MAX PV to 150k, not give me 120k pv in + because i don't want to one player have 140k, other 145k etc etc.
