SabrehavenServer/src/movement.h
2019-09-16 20:38:16 +03:00

169 lines
4.9 KiB
C++

/**
* Tibia GIMUD Server - a free and open-source MMORPG server emulator
* Copyright (C) 2019 Sabrehaven and Mark Samman <mark.samman@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef FS_MOVEMENT_H_5E0D2626D4634ACA83AC6509518E5F49
#define FS_MOVEMENT_H_5E0D2626D4634ACA83AC6509518E5F49
#include "baseevents.h"
#include "item.h"
#include "luascript.h"
enum MoveEvent_t {
MOVE_EVENT_STEP_IN,
MOVE_EVENT_STEP_OUT,
MOVE_EVENT_EQUIP,
MOVE_EVENT_DEEQUIP,
MOVE_EVENT_ADD_ITEM,
MOVE_EVENT_REMOVE_ITEM,
MOVE_EVENT_ADD_ITEM_ITEMTILE,
MOVE_EVENT_REMOVE_ITEM_ITEMTILE,
MOVE_EVENT_LAST,
MOVE_EVENT_NONE
};
class MoveEvent;
struct MoveEventList {
std::list<MoveEvent*> moveEvent[MOVE_EVENT_LAST];
};
typedef std::map<uint16_t, bool> VocEquipMap;
class MoveEvents final : public BaseEvents
{
public:
MoveEvents();
~MoveEvents();
// non-copyable
MoveEvents(const MoveEvents&) = delete;
MoveEvents& operator=(const MoveEvents&) = delete;
uint32_t onCreatureMove(Creature* creature, const Tile* tile, MoveEvent_t eventType);
uint32_t onPlayerEquip(Player* player, Item* item, slots_t slot, bool isCheck);
uint32_t onPlayerDeEquip(Player* player, Item* item, slots_t slot);
uint32_t onItemMove(Item* item, Tile* tile, bool isAdd);
MoveEvent* getEvent(Item* item, MoveEvent_t eventType);
protected:
typedef std::map<int32_t, MoveEventList> MoveListMap;
void clearMap(MoveListMap& map);
typedef std::map<Position, MoveEventList> MovePosListMap;
void clear() final;
LuaScriptInterface& getScriptInterface() final;
std::string getScriptBaseName() const final;
Event* getEvent(const std::string& nodeName) final;
bool registerEvent(Event* event, const pugi::xml_node& node) final;
void addEvent(MoveEvent* moveEvent, int32_t id, MoveListMap& map);
void addEvent(MoveEvent* moveEvent, const Position& pos, MovePosListMap& map);
MoveEvent* getEvent(const Tile* tile, MoveEvent_t eventType);
MoveEvent* getEvent(Item* item, MoveEvent_t eventType, slots_t slot);
MoveListMap movementIdMap;
MoveListMap itemIdMap;
MovePosListMap positionMap;
LuaScriptInterface scriptInterface;
};
typedef uint32_t (StepFunction)(Creature* creature, Item* item, const Position& pos);
typedef uint32_t (MoveFunction)(Item* item, Item* tileItem, const Position& pos);
typedef uint32_t (EquipFunction)(MoveEvent* moveEvent, Player* player, Item* item, slots_t slot, bool boolean);
class MoveEvent final : public Event
{
public:
explicit MoveEvent(LuaScriptInterface* interface);
explicit MoveEvent(const MoveEvent* copy);
MoveEvent_t getEventType() const;
void setEventType(MoveEvent_t type);
bool configureEvent(const pugi::xml_node& node) final;
bool loadFunction(const pugi::xml_attribute& attr) final;
uint32_t fireStepEvent(Creature* creature, Item* item, const Position& pos);
uint32_t fireAddRemItem(Item* item, Item* tileItem, const Position& pos);
uint32_t fireEquip(Player* player, Item* item, slots_t slot, bool boolean);
uint32_t getSlot() const {
return slot;
}
//scripting
bool executeStep(Creature* creature, Item* item, const Position& pos);
bool executeEquip(Player* player, Item* item, slots_t slot);
bool executeAddRemItem(Item* item, Item* tileItem, const Position& pos);
//
//onEquip information
uint32_t getReqLevel() const {
return reqLevel;
}
uint32_t getReqMagLv() const {
return reqMagLevel;
}
bool isPremium() const {
return premium;
}
const std::string& getVocationString() const {
return vocationString;
}
uint32_t getWieldInfo() const {
return wieldInfo;
}
const VocEquipMap& getVocEquipMap() const {
return vocEquipMap;
}
protected:
std::string getScriptEventName() const final;
static StepFunction StepInField;
static StepFunction StepOutField;
static MoveFunction AddItemField;
static MoveFunction RemoveItemField;
static EquipFunction EquipItem;
static EquipFunction DeEquipItem;
MoveEvent_t eventType = MOVE_EVENT_NONE;
StepFunction* stepFunction = nullptr;
MoveFunction* moveFunction = nullptr;
EquipFunction* equipFunction = nullptr;
uint32_t slot = SLOTP_WHEREEVER;
//onEquip information
uint32_t reqLevel = 0;
uint32_t reqMagLevel = 0;
bool premium = false;
std::string vocationString;
uint32_t wieldInfo = 0;
VocEquipMap vocEquipMap;
};
#endif