mirror of
https://github.com/ErikasKontenis/SabrehavenServer.git
synced 2025-10-14 06:34:55 +02:00
fix all 8.0 monsters and add custom spell effects
This commit is contained in:
@@ -604,12 +604,38 @@ void Combat::combatTileEffects(const SpectatorVec& list, Creature* caster, Tile*
|
||||
void Combat::postCombatEffects(Creature* caster, const Position& pos, const CombatParams& params)
|
||||
{
|
||||
if (caster && params.distanceEffect != CONST_ANI_NONE) {
|
||||
addDistanceEffect(caster->getPosition(), pos, params.distanceEffect);
|
||||
addDistanceEffect(caster, caster->getPosition(), pos, params.distanceEffect);
|
||||
}
|
||||
}
|
||||
|
||||
void Combat::addDistanceEffect(const Position& fromPos, const Position& toPos, uint8_t effect)
|
||||
void Combat::addDistanceEffect(Creature* caster, const Position& fromPos, const Position& toPos, uint8_t effect)
|
||||
{
|
||||
if (effect == CONST_ANI_WEAPONTYPE) {
|
||||
if (!caster) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player* player = caster->getPlayer();
|
||||
if (!player) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (player->getWeaponType()) {
|
||||
case WEAPON_AXE:
|
||||
effect = CONST_ANI_WHIRLWINDAXE;
|
||||
break;
|
||||
case WEAPON_SWORD:
|
||||
effect = CONST_ANI_WHIRLWINDSWORD;
|
||||
break;
|
||||
case WEAPON_CLUB:
|
||||
effect = CONST_ANI_WHIRLWINDCLUB;
|
||||
break;
|
||||
default:
|
||||
effect = CONST_ANI_NONE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (effect != CONST_ANI_NONE) {
|
||||
g_game.addDistanceEffect(fromPos, toPos, effect);
|
||||
}
|
||||
@@ -1326,7 +1352,7 @@ bool Combat::doCombatHealth(Creature* caster, Creature* target, CombatDamage& da
|
||||
|
||||
if (canCombat) {
|
||||
if (caster && params.distanceEffect != CONST_ANI_NONE) {
|
||||
addDistanceEffect(caster->getPosition(), target->getPosition(), params.distanceEffect);
|
||||
addDistanceEffect(caster, caster->getPosition(), target->getPosition(), params.distanceEffect);
|
||||
}
|
||||
|
||||
canCombat = CombatHealthFunc(caster, target, params, &damage);
|
||||
@@ -1352,7 +1378,7 @@ void Combat::doCombatMana(Creature* caster, Creature* target, CombatDamage& dama
|
||||
|
||||
if (canCombat) {
|
||||
if (caster && params.distanceEffect != CONST_ANI_NONE) {
|
||||
addDistanceEffect(caster->getPosition(), target->getPosition(), params.distanceEffect);
|
||||
addDistanceEffect(caster, caster->getPosition(), target->getPosition(), params.distanceEffect);
|
||||
}
|
||||
|
||||
CombatManaFunc(caster, target, params, &damage);
|
||||
@@ -1381,7 +1407,7 @@ void Combat::doCombatCondition(Creature* caster, Creature* target, const CombatP
|
||||
|
||||
if (canCombat) {
|
||||
if (caster && params.distanceEffect != CONST_ANI_NONE) {
|
||||
addDistanceEffect(caster->getPosition(), target->getPosition(), params.distanceEffect);
|
||||
addDistanceEffect(caster, caster->getPosition(), target->getPosition(), params.distanceEffect);
|
||||
}
|
||||
|
||||
CombatConditionFunc(caster, target, params, nullptr);
|
||||
@@ -1410,7 +1436,7 @@ void Combat::doCombatDispel(Creature* caster, Creature* target, const CombatPara
|
||||
}
|
||||
|
||||
if (caster && params.distanceEffect != CONST_ANI_NONE) {
|
||||
addDistanceEffect(caster->getPosition(), target->getPosition(), params.distanceEffect);
|
||||
addDistanceEffect(caster, caster->getPosition(), target->getPosition(), params.distanceEffect);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1435,7 +1461,7 @@ void Combat::doCombatDefault(Creature* caster, Creature* target, const CombatPar
|
||||
*/
|
||||
|
||||
if (caster && params.distanceEffect != CONST_ANI_NONE) {
|
||||
addDistanceEffect(caster->getPosition(), target->getPosition(), params.distanceEffect);
|
||||
addDistanceEffect(caster, caster->getPosition(), target->getPosition(), params.distanceEffect);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -317,7 +317,7 @@ class Combat
|
||||
static ReturnValue canDoCombat(Creature* attacker, Creature* target);
|
||||
static void postCombatEffects(Creature* caster, const Position& pos, const CombatParams& params);
|
||||
|
||||
static void addDistanceEffect(const Position& fromPos, const Position& toPos, uint8_t effect);
|
||||
static void addDistanceEffect(Creature* caster, const Position& fromPos, const Position& toPos, uint8_t effect);
|
||||
|
||||
void doCombat(Creature* caster, Creature* target) const;
|
||||
void doCombat(Creature* caster, const Position& pos) const;
|
||||
|
19
src/const.h
19
src/const.h
@@ -58,6 +58,10 @@ enum MagicEffectClasses : uint8_t {
|
||||
CONST_ME_FIREWORK_YELLOW = 29,
|
||||
CONST_ME_FIREWORK_RED = 30,
|
||||
CONST_ME_FIREWORK_BLUE = 31,
|
||||
CONST_ME_STUN = 32,
|
||||
CONST_ME_SLEEP = 33,
|
||||
CONST_ME_WATERCREATURE = 34,
|
||||
CONST_ME_GROUNDSHAKER = 35,
|
||||
};
|
||||
|
||||
enum ShootType_t : uint8_t {
|
||||
@@ -79,6 +83,21 @@ enum ShootType_t : uint8_t {
|
||||
CONST_ANI_POWERBOLT = 14,
|
||||
CONST_ANI_POISON = 15,
|
||||
CONST_ANI_INFERNALBOLT = 16,
|
||||
CONST_ANI_HUNTINGSPEAR = 17,
|
||||
CONST_ANI_ENCHANTEDSPEAR = 18,
|
||||
CONST_ANI_REDSTAR = 19,
|
||||
CONST_ANI_GREENSTAR = 20,
|
||||
CONST_ANI_ROYALSPEAR = 21,
|
||||
CONST_ANI_SNIPERARROW = 22,
|
||||
CONST_ANI_ONYXARROW = 23,
|
||||
CONST_ANI_PIERCINGBOLT = 24,
|
||||
CONST_ANI_WHIRLWINDSWORD = 25,
|
||||
CONST_ANI_WHIRLWINDAXE = 26,
|
||||
CONST_ANI_WHIRLWINDCLUB = 27,
|
||||
CONST_ANI_ETHEREALSPEAR = 28,
|
||||
|
||||
// for internal use, don't send to client
|
||||
CONST_ANI_WEAPONTYPE = 0xFE, // 254
|
||||
};
|
||||
|
||||
enum SpeakClasses : uint8_t {
|
||||
|
@@ -1214,6 +1214,11 @@ void LuaScriptInterface::registerFunctions()
|
||||
registerEnum(CONST_ME_FIREWORK_YELLOW)
|
||||
registerEnum(CONST_ME_FIREWORK_RED)
|
||||
registerEnum(CONST_ME_FIREWORK_BLUE)
|
||||
registerEnum(CONST_ME_STUN)
|
||||
registerEnum(CONST_ME_SLEEP)
|
||||
registerEnum(CONST_ME_WATERCREATURE)
|
||||
registerEnum(CONST_ME_GROUNDSHAKER)
|
||||
|
||||
registerEnum(CONST_ANI_NONE)
|
||||
registerEnum(CONST_ANI_SPEAR)
|
||||
registerEnum(CONST_ANI_BOLT)
|
||||
@@ -1231,6 +1236,19 @@ void LuaScriptInterface::registerFunctions()
|
||||
registerEnum(CONST_ANI_POWERBOLT)
|
||||
registerEnum(CONST_ANI_POISON)
|
||||
registerEnum(CONST_ANI_INFERNALBOLT)
|
||||
registerEnum(CONST_ANI_HUNTINGSPEAR)
|
||||
registerEnum(CONST_ANI_ENCHANTEDSPEAR)
|
||||
registerEnum(CONST_ANI_REDSTAR)
|
||||
registerEnum(CONST_ANI_GREENSTAR)
|
||||
registerEnum(CONST_ANI_ROYALSPEAR)
|
||||
registerEnum(CONST_ANI_SNIPERARROW)
|
||||
registerEnum(CONST_ANI_ONYXARROW)
|
||||
registerEnum(CONST_ANI_PIERCINGBOLT)
|
||||
registerEnum(CONST_ANI_WHIRLWINDSWORD)
|
||||
registerEnum(CONST_ANI_WHIRLWINDAXE)
|
||||
registerEnum(CONST_ANI_WHIRLWINDCLUB)
|
||||
registerEnum(CONST_ANI_ETHEREALSPEAR)
|
||||
registerEnum(CONST_ANI_WEAPONTYPE)
|
||||
|
||||
registerEnum(CONST_PROP_BLOCKSOLID)
|
||||
registerEnum(CONST_PROP_HASHEIGHT)
|
||||
|
@@ -949,6 +949,8 @@ bool Monsters::loadMonster(const std::string& file, const std::string& monsterNa
|
||||
mType->info.elementMap[COMBAT_FIREDAMAGE] = pugi::cast<int32_t>(attr.value());
|
||||
} else if ((attr = elementNode.attribute("energyPercent"))) {
|
||||
mType->info.elementMap[COMBAT_ENERGYDAMAGE] = pugi::cast<int32_t>(attr.value());
|
||||
} else if ((attr = elementNode.attribute("drownPercent"))) {
|
||||
mType->info.elementMap[COMBAT_DROWNDAMAGE] = pugi::cast<int32_t>(attr.value());
|
||||
} else if ((attr = elementNode.attribute("lifedrainPercent"))) {
|
||||
mType->info.elementMap[COMBAT_LIFEDRAIN] = pugi::cast<int32_t>(attr.value());
|
||||
} else if ((attr = elementNode.attribute("manadrainPercent"))) {
|
||||
|
@@ -184,6 +184,15 @@ Item* Player::getWeapon() const
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
WeaponType_t Player::getWeaponType() const
|
||||
{
|
||||
Item* item = getWeapon();
|
||||
if (!item) {
|
||||
return WEAPON_NONE;
|
||||
}
|
||||
return item->getWeaponType();
|
||||
}
|
||||
|
||||
Item* Player::getAmmunition() const
|
||||
{
|
||||
return inventory[CONST_SLOT_AMMO];
|
||||
|
@@ -568,6 +568,7 @@ class Player final : public Creature, public Cylinder
|
||||
}
|
||||
|
||||
Item* getWeapon() const;
|
||||
WeaponType_t getWeaponType() const;
|
||||
Item* getAmmunition() const;
|
||||
void getShieldAndWeapon(const Item*& shield, const Item*& weapon) const;
|
||||
|
||||
|
@@ -674,6 +674,10 @@ MagicEffectNames magicEffectNames[] = {
|
||||
{"yellowfirework", CONST_ME_FIREWORK_YELLOW},
|
||||
{"redfirework", CONST_ME_FIREWORK_RED},
|
||||
{"bluefirework", CONST_ME_FIREWORK_BLUE},
|
||||
{"stun", CONST_ME_STUN},
|
||||
{"sleep", CONST_ME_SLEEP},
|
||||
{"watercreature", CONST_ME_WATERCREATURE},
|
||||
{"groundshaker", CONST_ME_GROUNDSHAKER},
|
||||
};
|
||||
|
||||
ShootTypeNames shootTypeNames[] = {
|
||||
@@ -693,6 +697,18 @@ ShootTypeNames shootTypeNames[] = {
|
||||
{"powerbolt", CONST_ANI_POWERBOLT},
|
||||
{"poison", CONST_ANI_POISON},
|
||||
{"infernalbolt", CONST_ANI_INFERNALBOLT},
|
||||
{"huntingspear", CONST_ANI_HUNTINGSPEAR},
|
||||
{"enchantedspear", CONST_ANI_ENCHANTEDSPEAR},
|
||||
{"redstar", CONST_ANI_REDSTAR},
|
||||
{"greenstar", CONST_ANI_GREENSTAR},
|
||||
{"royalspear", CONST_ANI_ROYALSPEAR},
|
||||
{"sniperarrow", CONST_ANI_SNIPERARROW},
|
||||
{"onyxarrow", CONST_ANI_ONYXARROW},
|
||||
{"piercingbolt", CONST_ANI_PIERCINGBOLT},
|
||||
{"whirlwindsword", CONST_ANI_WHIRLWINDSWORD},
|
||||
{"whirlwindaxe", CONST_ANI_WHIRLWINDAXE},
|
||||
{"whirldwindclub", CONST_ANI_WHIRLWINDCLUB},
|
||||
{"etherealspear", CONST_ANI_ETHEREALSPEAR},
|
||||
};
|
||||
|
||||
CombatTypeNames combatTypeNames[] = {
|
||||
|
Reference in New Issue
Block a user