fix all 8.0 monsters and add custom spell effects

This commit is contained in:
ErikasKontenis
2022-04-24 18:42:44 +03:00
parent 11a73011f1
commit d5be03c92b
71 changed files with 359 additions and 621 deletions

View File

@@ -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);
}
}
}

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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)

View File

@@ -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"))) {

View File

@@ -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];

View File

@@ -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;

View File

@@ -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[] = {