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

This commit is contained in:
ErikasKontenis 2019-12-04 22:00:18 +02:00
parent a28bfd7171
commit 4a87cd754c
10 changed files with 57 additions and 16 deletions

View File

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

View File

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

View File

@ -28,7 +28,7 @@
<attribute key="shootEffect" value="ice"/>
<attribute key="areaEffect" value="icearea"/>
</attack>
<attack name="drown" chance="100" target="1" range="7" radius="2" min="-330" max="-450">
<attack name="drown" chance="10" target="1" range="7" radius="2" min="-330" max="-450">
<attribute key="areaEffect" value="bluebubble"/>
</attack>
</attacks>

View File

@ -388,7 +388,9 @@
<movevent event="StepIn" movementid="237" script="nostalrius/237.lua" />
<!-- Nostalrius Default Movements -->
<movevent event="StepIn" itemid="5404" script="misc/drowning.lua" />
<movevent event="StepOut" itemid="5404" script="misc/drowning.lua"/>
<!-- Floorchange -->
<movevent event="StepIn" itemid="293" script="misc/floorchange.lua" />
<movevent event="AddItem" itemid="293" tileitem="1" script="misc/floorchange.lua" />

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -876,7 +876,7 @@ void Monster::doAttacking(uint32_t)
for (spellBlock_t& spellBlock : mType->info.attackSpells) {
if (spellBlock.range != 0 && std::max<uint32_t>(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);