mirror of
https://github.com/ErikasKontenis/SabrehavenServer.git
synced 2026-01-13 17:11:29 +01:00
Full Distribution
This commit is contained in:
201
src/monsters.h
Normal file
201
src/monsters.h
Normal file
@@ -0,0 +1,201 @@
|
||||
/**
|
||||
* Tibia GIMUD Server - a free and open-source MMORPG server emulator
|
||||
* Copyright (C) 2017 Alejandro Mujica <alejandrodemujica@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_MONSTERS_H_776E8327BCE2450EB7C4A260785E6C0D
|
||||
#define FS_MONSTERS_H_776E8327BCE2450EB7C4A260785E6C0D
|
||||
|
||||
#include "creature.h"
|
||||
|
||||
#define MAX_LOOTCHANCE 1000
|
||||
#define MAX_STATICWALK 100
|
||||
|
||||
struct LootBlock {
|
||||
uint16_t id;
|
||||
uint32_t countmax;
|
||||
uint32_t chance;
|
||||
|
||||
//optional
|
||||
int32_t subType;
|
||||
int32_t actionId;
|
||||
std::string text;
|
||||
|
||||
std::vector<LootBlock> childLoot;
|
||||
LootBlock() {
|
||||
id = 0;
|
||||
countmax = 0;
|
||||
chance = 0;
|
||||
|
||||
subType = -1;
|
||||
actionId = -1;
|
||||
}
|
||||
};
|
||||
|
||||
struct summonBlock_t {
|
||||
std::string name;
|
||||
uint32_t chance;
|
||||
uint32_t max;
|
||||
bool force = false;
|
||||
};
|
||||
|
||||
class BaseSpell;
|
||||
struct spellBlock_t {
|
||||
constexpr spellBlock_t() = default;
|
||||
~spellBlock_t();
|
||||
spellBlock_t(const spellBlock_t& other) = delete;
|
||||
spellBlock_t& operator=(const spellBlock_t& other) = delete;
|
||||
spellBlock_t(spellBlock_t&& other) :
|
||||
spell(other.spell),
|
||||
chance(other.chance),
|
||||
range(other.range),
|
||||
minCombatValue(other.minCombatValue),
|
||||
maxCombatValue(other.maxCombatValue),
|
||||
attack(other.attack),
|
||||
skill(other.skill),
|
||||
combatSpell(other.combatSpell) {
|
||||
other.spell = nullptr;
|
||||
}
|
||||
|
||||
BaseSpell* spell = nullptr;
|
||||
uint32_t chance = 100;
|
||||
uint32_t range = 0;
|
||||
int32_t minCombatValue = 0;
|
||||
int32_t maxCombatValue = 0;
|
||||
int32_t attack = 0;
|
||||
int32_t skill = 0;
|
||||
bool combatSpell = false;
|
||||
};
|
||||
|
||||
struct voiceBlock_t {
|
||||
std::string text;
|
||||
bool yellText;
|
||||
};
|
||||
|
||||
class MonsterType
|
||||
{
|
||||
struct MonsterInfo {
|
||||
LuaScriptInterface* scriptInterface;
|
||||
|
||||
std::map<CombatType_t, int32_t> elementMap;
|
||||
|
||||
std::vector<voiceBlock_t> voiceVector;
|
||||
|
||||
std::vector<LootBlock> lootItems;
|
||||
std::vector<std::string> scripts;
|
||||
std::vector<spellBlock_t> attackSpells;
|
||||
std::vector<spellBlock_t> defenseSpells;
|
||||
std::vector<summonBlock_t> summons;
|
||||
|
||||
Skulls_t skull = SKULL_NONE;
|
||||
Outfit_t outfit = {};
|
||||
RaceType_t race = RACE_BLOOD;
|
||||
|
||||
LightInfo light = {};
|
||||
uint16_t lookcorpse = 0;
|
||||
|
||||
uint64_t experience = 0;
|
||||
|
||||
uint32_t manaCost = 0;
|
||||
uint32_t maxSummons = 0;
|
||||
uint32_t changeTargetSpeed = 0;
|
||||
uint32_t conditionImmunities = 0;
|
||||
uint32_t damageImmunities = 0;
|
||||
uint32_t baseSpeed = 70;
|
||||
|
||||
int32_t creatureAppearEvent = -1;
|
||||
int32_t creatureDisappearEvent = -1;
|
||||
int32_t creatureMoveEvent = -1;
|
||||
int32_t creatureSayEvent = -1;
|
||||
int32_t thinkEvent = -1;
|
||||
int32_t targetDistance = 1;
|
||||
int32_t runAwayHealth = 0;
|
||||
int32_t health = 100;
|
||||
int32_t healthMax = 100;
|
||||
int32_t changeTargetChance = 0;
|
||||
int32_t strategyNearestEnemy = 0;
|
||||
int32_t strategyWeakestEnemy = 0;
|
||||
int32_t strategyMostDamageEnemy = 0;
|
||||
int32_t strategyRandomEnemy = 0;
|
||||
int32_t armor = 0;
|
||||
int32_t defense = 0;
|
||||
int32_t attack = 0;
|
||||
int32_t skill = 0;
|
||||
int32_t poison = 0;
|
||||
|
||||
bool canPushItems = false;
|
||||
bool canPushCreatures = false;
|
||||
bool pushable = true;
|
||||
bool isSummonable = false;
|
||||
bool isIllusionable = false;
|
||||
bool isConvinceable = false;
|
||||
bool isAttackable = true;
|
||||
bool isHostile = true;
|
||||
bool hiddenHealth = false;
|
||||
};
|
||||
|
||||
public:
|
||||
MonsterType() = default;
|
||||
|
||||
// non-copyable
|
||||
MonsterType(const MonsterType&) = delete;
|
||||
MonsterType& operator=(const MonsterType&) = delete;
|
||||
|
||||
std::string name;
|
||||
std::string nameDescription;
|
||||
|
||||
MonsterInfo info;
|
||||
|
||||
void createLoot(Container* corpse);
|
||||
bool createLootContainer(Container* parent, const LootBlock& lootblock);
|
||||
std::vector<Item*> createLootItem(const LootBlock& lootBlock);
|
||||
};
|
||||
|
||||
class Monsters
|
||||
{
|
||||
public:
|
||||
Monsters() = default;
|
||||
// non-copyable
|
||||
Monsters(const Monsters&) = delete;
|
||||
Monsters& operator=(const Monsters&) = delete;
|
||||
|
||||
bool loadFromXml(bool reloading = false);
|
||||
bool isLoaded() const {
|
||||
return loaded;
|
||||
}
|
||||
bool reload();
|
||||
|
||||
MonsterType* getMonsterType(const std::string& name);
|
||||
|
||||
static uint32_t getLootRandom();
|
||||
|
||||
private:
|
||||
ConditionDamage* getDamageCondition(ConditionType_t conditionType, int32_t cycles, int32_t count, int32_t max_count);
|
||||
bool deserializeSpell(const pugi::xml_node& node, spellBlock_t& sb, const std::string& description = "");
|
||||
|
||||
bool loadMonster(const std::string& file, const std::string& monsterName, std::list<std::pair<MonsterType*, std::string>>& monsterScriptList, bool reloading = false);
|
||||
|
||||
void loadLootContainer(const pugi::xml_node& node, LootBlock&);
|
||||
bool loadLootItem(const pugi::xml_node& node, LootBlock&);
|
||||
|
||||
std::map<std::string, MonsterType> monsters;
|
||||
std::unique_ptr<LuaScriptInterface> scriptInterface;
|
||||
|
||||
bool loaded = false;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user