From 4a87cd754c6664011f928aad57dd8f1ebf4af38f Mon Sep 17 00:00:00 2001 From: ErikasKontenis Date: Wed, 4 Dec 2019 22:00:18 +0200 Subject: [PATCH] introduce drowning condition, fix monsters to use uniform random, fix poison field on walk instant damage hit, need to check how drowning works and remove damage only when player is idle for 4s --- data/actions/scripts/misc/fluids.lua | 9 ++----- data/items/items.srv | 8 +++--- data/monster/781/massive water elemental.xml | 2 +- data/movements/movements.xml | 4 ++- data/movements/scripts/misc/drowning.lua | 27 ++++++++++++++++++++ src/condition.cpp | 15 +++++++++++ src/condition.h | 2 ++ src/items.cpp | 1 - src/luascript.cpp | 1 + src/monster.cpp | 4 +-- 10 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 data/movements/scripts/misc/drowning.lua diff --git a/data/actions/scripts/misc/fluids.lua b/data/actions/scripts/misc/fluids.lua index 4d8160f..c3ce9d6 100644 --- a/data/actions/scripts/misc/fluids.lua +++ b/data/actions/scripts/misc/fluids.lua @@ -2,12 +2,7 @@ local drunk = Condition(CONDITION_DRUNK) drunk:setParameter(CONDITION_PARAM_TICKS, 60000) local poison = Condition(CONDITION_POISON) -poison:setParameter(CONDITION_PARAM_DELAYED, true) -poison:setParameter(CONDITION_PARAM_MINVALUE, -50) -poison:setParameter(CONDITION_PARAM_MAXVALUE, -120) -poison:setParameter(CONDITION_PARAM_STARTVALUE, -5) -poison:setParameter(CONDITION_PARAM_TICKINTERVAL, 5000) -poison:setParameter(CONDITION_PARAM_FORCEUPDATE, true) +poison:setTiming(100) local messages = { [FLUID_WATER] = "Gulp.", @@ -48,7 +43,7 @@ function onUse(player, item, fromPosition, target, toPosition) if self and item:getFluidType() == FLUID_BEER or item:getFluidType() == FLUID_WINE or item:getFluidType() == FLUID_RUM then player:addCondition(drunk) elseif self and item:getFluidType() == FLUID_SLIME then - player:addCondition(slime) + player:addCondition(poison) elseif item:getFluidType() == FLUID_MANAFLUID then target:addMana(math.random(50, 100)) target:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) diff --git a/data/items/items.srv b/data/items/items.srv index 41bc61b..37bd791 100644 --- a/data/items/items.srv +++ b/data/items/items.srv @@ -9303,7 +9303,7 @@ TypeID = 2121 Name = "poison gas" Flags = {CollisionEvent,Unmove,Avoid,MagicField,Expire} Attributes = {AvoidDamageTypes=POISON,Brightness=2,LightColor=104,ExpireTarget=0,TotalExpireTime=250} -MagicField = {Type=POISON,Count=100} +MagicField = {Type=POISON,Count=100,Damage=5} TypeID = 2122 Name = "an energy field" @@ -9338,7 +9338,7 @@ TypeID = 2127 Name = "poison gas" Flags = {CollisionEvent,Unmove,Avoid,MagicField} Attributes = {AvoidDamageTypes=POISON,Brightness=2,LightColor=104} -MagicField = {Type=POISON,Count=100} +MagicField = {Type=POISON,Count=100,Damage=5} TypeID = 2128 Name = "a magic wall" @@ -9376,7 +9376,7 @@ TypeID = 2134 Name = "poison gas" Flags = {CollisionEvent,Unmove,Avoid,MagicField,Expire} Attributes = {AvoidDamageTypes=POISON,Brightness=2,LightColor=214,ExpireTarget=0,TotalExpireTime=8} -MagicField = {Type=POISON,Count=100} +MagicField = {Type=POISON,Count=100,Damage=5} TypeID = 2135 Name = "an energy field" @@ -24442,7 +24442,7 @@ Attributes = {Brightness=7,LightColor=207} TypeID = 5404 Name = "ocean floor" -Flags = {Bank,Unmove} +Flags = {Bank,Unmove,CollisionEvent} Attributes = {Waypoints=500} TypeID = 5405 diff --git a/data/monster/781/massive water elemental.xml b/data/monster/781/massive water elemental.xml index d80a50b..e3a03f9 100644 --- a/data/monster/781/massive water elemental.xml +++ b/data/monster/781/massive water elemental.xml @@ -28,7 +28,7 @@ - + diff --git a/data/movements/movements.xml b/data/movements/movements.xml index 420dbab..5b07647 100644 --- a/data/movements/movements.xml +++ b/data/movements/movements.xml @@ -388,7 +388,9 @@ - + + + diff --git a/data/movements/scripts/misc/drowning.lua b/data/movements/scripts/misc/drowning.lua new file mode 100644 index 0000000..aeabc52 --- /dev/null +++ b/data/movements/scripts/misc/drowning.lua @@ -0,0 +1,27 @@ +local condition = Condition(CONDITION_DROWN) +condition:setParameter(CONDITION_PARAM_HIT_DAMAGE, 20) +condition:setTiming(9999) + + +function onStepIn(creature, item, position, fromPosition) + local player = creature:getPlayer() + if player == nil then + return true + end + + if math.random(1, 10) == 1 then + position:sendMagicEffect(CONST_ME_BUBBLES) + end + player:addCondition(condition) + return true +end + +function onStepOut(creature, item, position, fromPosition) + local player = creature:getPlayer() + if player == nil then + return true + end + + player:removeCondition(CONDITION_DROWN) + return true +end diff --git a/src/condition.cpp b/src/condition.cpp index d5c5ece..237db4e 100644 --- a/src/condition.cpp +++ b/src/condition.cpp @@ -916,6 +916,21 @@ bool ConditionDamage::executeCondition(Creature* creature, int32_t) } else { return false; } + } else if (conditionType == CONDITION_DROWN) { + const int32_t r_cycle = cycle; + if (r_cycle) { + if (count <= 0) { + count = max_count; + cycle = r_cycle + 2 * (r_cycle <= 0) - 1; + doDamage(creature, -20); + } + else { + --count; + } + } + else { + return false; + } } return true; diff --git a/src/condition.h b/src/condition.h index 2535aa0..fe81f43 100644 --- a/src/condition.h +++ b/src/condition.h @@ -255,6 +255,8 @@ class ConditionDamage final : public Condition count = max_count = 8; } else if (type == CONDITION_ENERGY) { count = max_count = 10; + } else if (type == CONDITION_DROWN) { + count = max_count = 3; } } diff --git a/src/items.cpp b/src/items.cpp index 767ada3..e87c360 100644 --- a/src/items.cpp +++ b/src/items.cpp @@ -515,7 +515,6 @@ bool Items::loadItems() items[id].conditionDamage.reset(conditionDamage); } else if (identifier == "poison") { conditionDamage = new ConditionDamage(CONDITIONID_COMBAT, CONDITION_POISON); - conditionDamage->setParam(CONDITION_PARAM_DELAYED, true); combatType = COMBAT_EARTHDAMAGE; items[id].combatType = combatType; items[id].conditionDamage.reset(conditionDamage); diff --git a/src/luascript.cpp b/src/luascript.cpp index a995631..93466f1 100644 --- a/src/luascript.cpp +++ b/src/luascript.cpp @@ -1154,6 +1154,7 @@ void LuaScriptInterface::registerFunctions() registerEnum(CONDITION_PARAM_STAT_MAXMANAPOINTSPERCENT) registerEnum(CONDITION_PARAM_STAT_MAGICPOINTSPERCENT) registerEnum(CONDITION_PARAM_PERIODICDAMAGE) + registerEnum(CONDITION_PARAM_HIT_DAMAGE) registerEnum(CONDITION_PARAM_SKILL_MELEEPERCENT) registerEnum(CONDITION_PARAM_SKILL_FISTPERCENT) registerEnum(CONDITION_PARAM_SKILL_CLUBPERCENT) diff --git a/src/monster.cpp b/src/monster.cpp index 9c65630..60fd7d1 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -876,7 +876,7 @@ void Monster::doAttacking(uint32_t) for (spellBlock_t& spellBlock : mType->info.attackSpells) { if (spellBlock.range != 0 && std::max(Position::getDistanceX(myPos, targetPos), Position::getDistanceY(myPos, targetPos)) <= spellBlock.range) { - if (normal_random(0, spellBlock.chance) == 0 && (master || health > mType->info.runAwayHealth || normal_random(1, 3) == 1)) { + if (uniform_random(0, spellBlock.chance) == 0 && (master || health > mType->info.runAwayHealth || uniform_random(1, 3) == 1)) { updateLookDirection(); minCombatValue = spellBlock.minCombatValue; @@ -977,7 +977,7 @@ void Monster::onThinkTarget(uint32_t interval) void Monster::onThinkDefense(uint32_t) { for (const spellBlock_t& spellBlock : mType->info.defenseSpells) { - if (normal_random(0, spellBlock.chance) == 0 && (master || health > mType->info.runAwayHealth || normal_random(1, 3) == 1)) { + if (uniform_random(0, spellBlock.chance) == 0 && (master || health > mType->info.runAwayHealth || uniform_random(1, 3) == 1)) { minCombatValue = spellBlock.minCombatValue; maxCombatValue = spellBlock.maxCombatValue; spellBlock.spell->castSpell(this, this);