uint32_t MoveEvent::EquipItem(Player* player, Item* item, slots_t slot, bool transform) { if(player->isItemAbilityEnabled(slot)){ return 1; } //Enable item only when requirements are complete //This includes item transforming MoveEvent* moveEvent = g_moveEvents->getEvent(item, MOVE_EVENT_EQUIP); if(moveEvent && !player->hasFlag(PlayerFlag_IgnoreWeaponCheck)){ if(player->getLevel() < moveEvent->getReqLevel() || player->getMagicLevel() < moveEvent->getReqMagLv() || !player->isPremium() && moveEvent->isPremium() || !moveEvent->getVocEquipMap().empty() && moveEvent->getVocEquipMap().find(player->getVocationId()) == moveEvent->getVocEquipMap().end()){ return 1; } } const ItemType& it = Item::items[item->getID()]; if(it.transformEquipTo != 0){ Item* newItem = g_game.transformItem(item, it.transformEquipTo); g_game.startDecay(newItem); } else{ player->setItemAbility(slot, true); } if(it.abilities.invisible){ Condition* condition = Condition::createCondition((ConditionId_t)slot, CONDITION_INVISIBLE, -1, 0); player->addCondition(condition); } if(it.abilities.manaShield){ Condition* condition = Condition::createCondition((ConditionId_t)slot, CONDITION_MANASHIELD, -1, 0); player->addCondition(condition); } if(it.abilities.speed != 0){ g_game.changeSpeed(player, it.abilities.speed); } if(it.abilities.conditionSuppressions != 0){ player->setConditionSuppressions(it.abilities.conditionSuppressions, false); player->sendIcons(); } if(it.abilities.regeneration){ Condition* condition = Condition::createCondition((ConditionId_t)slot, CONDITION_REGENERATION, -1, 0); if(it.abilities.healthGain != 0){ condition->setParam(CONDITIONPARAM_HEALTHGAIN, it.abilities.healthGain); } if(it.abilities.healthTicks != 0){ condition->setParam(CONDITIONPARAM_HEALTHTICKS, it.abilities.healthTicks); } if(it.abilities.manaGain != 0){ condition->setParam(CONDITIONPARAM_MANAGAIN, it.abilities.manaGain); } if(it.abilities.manaTicks != 0){ condition->setParam(CONDITIONPARAM_MANATICKS, it.abilities.manaTicks); } player->addCondition(condition); } //skill modifiers bool needUpdateSkills = false; for(int32_t i = SKILL_FIRST; i <= SKILL_LAST; ++i){ if(it.abilities.skills[i]){ needUpdateSkills = true; player->setVarSkill((skills_t)i, it.abilities.skills[i]); } } if(needUpdateSkills){ player->sendSkills(); } //stat modifiers bool needUpdateStats = false; for(int32_t s = STAT_FIRST; s <= STAT_LAST; ++s){ if(it.abilities.stats[s]){ needUpdateStats = true; player->setVarStats((stats_t)s, it.abilities.stats[s]); } if(it.abilities.statsPercent[s]){ needUpdateStats = true; player->setVarStats((stats_t)s, (int32_t)(player->getDefaultStats((stats_t)s) * ((it.abilities.statsPercent[s] - 100) / 100.f))); } } if(needUpdateStats){ player->sendStats(); } return 1; }
bool MoveEvents::registerEvent(Event* event, xmlNodePtr p) { MoveEvent* moveEvent = dynamic_cast<MoveEvent*>(event); if (!moveEvent) { return false; } bool success = true; int32_t id, endId; std::string str; MoveEvent_t eventType = moveEvent->getEventType(); if (eventType == MOVE_EVENT_ADD_ITEM || eventType == MOVE_EVENT_REMOVE_ITEM) { if (readXMLInteger(p, "tileitem", id) && id == 1) { switch (eventType) { case MOVE_EVENT_ADD_ITEM: moveEvent->setEventType(MOVE_EVENT_ADD_ITEM_ITEMTILE); break; case MOVE_EVENT_REMOVE_ITEM: moveEvent->setEventType(MOVE_EVENT_REMOVE_ITEM_ITEMTILE); break; default: break; } } } if (readXMLInteger(p, "itemid", id)) { addEvent(moveEvent, id, m_itemIdMap); if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { ItemType& it = Item::items.getItemType(id); it.wieldInfo = moveEvent->getWieldInfo(); it.minReqLevel = moveEvent->getReqLevel(); it.minReqMagicLevel = moveEvent->getReqMagLv(); it.vocationString = moveEvent->getVocationString(); } } else if (readXMLInteger(p, "fromid", id) && readXMLInteger(p, "toid", endId)) { addEvent(moveEvent, id, m_itemIdMap); if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { ItemType& it = Item::items.getItemType(id); it.wieldInfo = moveEvent->getWieldInfo(); it.minReqLevel = moveEvent->getReqLevel(); it.minReqMagicLevel = moveEvent->getReqMagLv(); it.vocationString = moveEvent->getVocationString(); while (id < endId) { id++; addEvent(new MoveEvent(moveEvent), id, m_itemIdMap); ItemType& tit = Item::items.getItemType(id); tit.wieldInfo = moveEvent->getWieldInfo(); tit.minReqLevel = moveEvent->getReqLevel(); tit.minReqMagicLevel = moveEvent->getReqMagLv(); tit.vocationString = moveEvent->getVocationString(); } } else { while (id < endId) { addEvent(new MoveEvent(moveEvent), ++id, m_itemIdMap); } } } else if (readXMLInteger(p, "uniqueid", id)) { addEvent(moveEvent, id, m_uniqueIdMap); } else if (readXMLInteger(p, "fromuid", id) && readXMLInteger(p, "touid", endId)) { addEvent(moveEvent, id, m_uniqueIdMap); while (id < endId) { addEvent(new MoveEvent(moveEvent), ++id, m_uniqueIdMap); } } else if (readXMLInteger(p, "actionid", id) || readXMLInteger(p, "aid", id)) { addEvent(moveEvent, id, m_actionIdMap); } else if (readXMLInteger(p, "fromaid", id) && readXMLInteger(p, "toaid", endId)) { addEvent(moveEvent, id, m_actionIdMap); while (id < endId) { addEvent(new MoveEvent(moveEvent), ++id, m_actionIdMap); } } else if (readXMLString(p, "pos", str)) { std::vector<int32_t> posList = vectorAtoi(explodeString(str, ";")); if (posList.size() >= 3) { Position pos(posList[0], posList[1], posList[2]); addEvent(moveEvent, pos, m_positionMap); } else { success = false; } } else { success = false; } return success; }
bool MoveEvents::registerEvent(Event* event, xmlNodePtr p) { MoveEvent* moveEvent = dynamic_cast<MoveEvent*>(event); if(!moveEvent) return false; bool success = true; int id; std::string str; MoveEvent_t eventType = moveEvent->getEventType(); if(eventType == MOVE_EVENT_ADD_ITEM || eventType == MOVE_EVENT_REMOVE_ITEM){ if(readXMLInteger(p,"tileitem",id) && id == 1){ switch(eventType){ case MOVE_EVENT_ADD_ITEM: moveEvent->setEventType(MOVE_EVENT_ADD_ITEM_ITEMTILE); break; case MOVE_EVENT_REMOVE_ITEM: moveEvent->setEventType(MOVE_EVENT_REMOVE_ITEM_ITEMTILE); break; default: break; } } } if(readXMLInteger(p,"itemid",id)){ if(moveEvent->getEventType() == MOVE_EVENT_EQUIP){ ItemType& it = Item::items.getItemType(id); it.wieldInfo = moveEvent->getWieldInfo(); it.minReqLevel = moveEvent->getReqLevel(); it.minReqMagicLevel = moveEvent->getReqMagLv(); it.vocationString = moveEvent->getVocationString(); } addEvent(moveEvent, id, m_itemIdMap); } else if(readXMLInteger(p,"uniqueid",id)){ addEvent(moveEvent, id, m_uniqueIdMap); } else if(readXMLInteger(p,"actionid",id)){ addEvent(moveEvent, id, m_actionIdMap); } else if(readXMLString(p,"pos",str)){ std::vector<std::string> posList = explodeString(str, ";"); if(posList.size() < 3){ success = false; } else{ Position pos; pos.x = atoi(posList[0].c_str()); pos.y = atoi(posList[1].c_str()); pos.z = atoi(posList[2].c_str()); addEvent(moveEvent, pos, m_positionMap); } } else{ success = false; } return success; }
bool MoveEvents::registerEvent(Event* event, const pugi::xml_node& node) { MoveEvent* moveEvent = static_cast<MoveEvent*>(event); //event is guaranteed to be a MoveEvent const MoveEvent_t eventType = moveEvent->getEventType(); if (eventType == MOVE_EVENT_ADD_ITEM || eventType == MOVE_EVENT_REMOVE_ITEM) { pugi::xml_attribute tileItemAttribute = node.attribute("tileitem"); if (tileItemAttribute && pugi::cast<uint16_t>(tileItemAttribute.value()) == 1) { switch (eventType) { case MOVE_EVENT_ADD_ITEM: moveEvent->setEventType(MOVE_EVENT_ADD_ITEM_ITEMTILE); break; case MOVE_EVENT_REMOVE_ITEM: moveEvent->setEventType(MOVE_EVENT_REMOVE_ITEM_ITEMTILE); break; default: break; } } } pugi::xml_attribute attr; if ((attr = node.attribute("itemid"))) { int32_t id = pugi::cast<int32_t>(attr.value()); addEvent(moveEvent, id, m_itemIdMap); if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { ItemType& it = Item::items.getItemType(id); it.wieldInfo = moveEvent->getWieldInfo(); it.minReqLevel = moveEvent->getReqLevel(); it.minReqMagicLevel = moveEvent->getReqMagLv(); it.vocationString = moveEvent->getVocationString(); } } else if ((attr = node.attribute("fromid"))) { uint32_t id = pugi::cast<uint32_t>(attr.value()); uint32_t endId = pugi::cast<uint32_t>(node.attribute("toid").value()); addEvent(moveEvent, id, m_itemIdMap); if (moveEvent->getEventType() == MOVE_EVENT_EQUIP) { ItemType& it = Item::items.getItemType(id); it.wieldInfo = moveEvent->getWieldInfo(); it.minReqLevel = moveEvent->getReqLevel(); it.minReqMagicLevel = moveEvent->getReqMagLv(); it.vocationString = moveEvent->getVocationString(); while (++id <= endId) { addEvent(moveEvent, id, m_itemIdMap); ItemType& tit = Item::items.getItemType(id); tit.wieldInfo = moveEvent->getWieldInfo(); tit.minReqLevel = moveEvent->getReqLevel(); tit.minReqMagicLevel = moveEvent->getReqMagLv(); tit.vocationString = moveEvent->getVocationString(); } } else { while (++id <= endId) { addEvent(moveEvent, id, m_itemIdMap); } } } else if ((attr = node.attribute("uniqueid"))) { addEvent(moveEvent, pugi::cast<int32_t>(attr.value()), m_uniqueIdMap); } else if ((attr = node.attribute("fromuid"))) { uint32_t id = pugi::cast<uint32_t>(attr.value()); uint32_t endId = pugi::cast<uint32_t>(node.attribute("touid").value()); addEvent(moveEvent, id, m_uniqueIdMap); while (++id <= endId) { addEvent(moveEvent, id, m_uniqueIdMap); } } else if ((attr = node.attribute("actionid"))) { addEvent(moveEvent, pugi::cast<int32_t>(attr.value()), m_actionIdMap); } else if ((attr = node.attribute("fromaid"))) { uint32_t id = pugi::cast<uint32_t>(attr.value()); uint32_t endId = pugi::cast<uint32_t>(node.attribute("toaid").value()); addEvent(moveEvent, id, m_actionIdMap); while (++id <= endId) { addEvent(moveEvent, id, m_actionIdMap); } } else if ((attr = node.attribute("pos"))) { std::vector<int32_t> posList = vectorAtoi(explodeString(attr.as_string(), ";")); if (posList.size() < 3) { return false; } Position pos(posList[0], posList[1], posList[2]); addEvent(moveEvent, pos, m_positionMap); } else { return false; } return true; }