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) drunk:setParameter(CONDITION_PARAM_TICKS, 60000)
local poison = Condition(CONDITION_POISON) local poison = Condition(CONDITION_POISON)
poison:setParameter(CONDITION_PARAM_DELAYED, true) poison:setTiming(100)
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)
local messages = { local messages = {
[FLUID_WATER] = "Gulp.", [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 if self and item:getFluidType() == FLUID_BEER or item:getFluidType() == FLUID_WINE or item:getFluidType() == FLUID_RUM then
player:addCondition(drunk) player:addCondition(drunk)
elseif self and item:getFluidType() == FLUID_SLIME then elseif self and item:getFluidType() == FLUID_SLIME then
player:addCondition(slime) player:addCondition(poison)
elseif item:getFluidType() == FLUID_MANAFLUID then elseif item:getFluidType() == FLUID_MANAFLUID then
target:addMana(math.random(50, 100)) target:addMana(math.random(50, 100))
target:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) target:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE)

View File

@ -9303,7 +9303,7 @@ TypeID = 2121
Name = "poison gas" Name = "poison gas"
Flags = {CollisionEvent,Unmove,Avoid,MagicField,Expire} Flags = {CollisionEvent,Unmove,Avoid,MagicField,Expire}
Attributes = {AvoidDamageTypes=POISON,Brightness=2,LightColor=104,ExpireTarget=0,TotalExpireTime=250} 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 TypeID = 2122
Name = "an energy field" Name = "an energy field"
@ -9338,7 +9338,7 @@ TypeID = 2127
Name = "poison gas" Name = "poison gas"
Flags = {CollisionEvent,Unmove,Avoid,MagicField} Flags = {CollisionEvent,Unmove,Avoid,MagicField}
Attributes = {AvoidDamageTypes=POISON,Brightness=2,LightColor=104} Attributes = {AvoidDamageTypes=POISON,Brightness=2,LightColor=104}
MagicField = {Type=POISON,Count=100} MagicField = {Type=POISON,Count=100,Damage=5}
TypeID = 2128 TypeID = 2128
Name = "a magic wall" Name = "a magic wall"
@ -9376,7 +9376,7 @@ TypeID = 2134
Name = "poison gas" Name = "poison gas"
Flags = {CollisionEvent,Unmove,Avoid,MagicField,Expire} Flags = {CollisionEvent,Unmove,Avoid,MagicField,Expire}
Attributes = {AvoidDamageTypes=POISON,Brightness=2,LightColor=214,ExpireTarget=0,TotalExpireTime=8} 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 TypeID = 2135
Name = "an energy field" Name = "an energy field"
@ -24442,7 +24442,7 @@ Attributes = {Brightness=7,LightColor=207}
TypeID = 5404 TypeID = 5404
Name = "ocean floor" Name = "ocean floor"
Flags = {Bank,Unmove} Flags = {Bank,Unmove,CollisionEvent}
Attributes = {Waypoints=500} Attributes = {Waypoints=500}
TypeID = 5405 TypeID = 5405

View File

@ -28,7 +28,7 @@
<attribute key="shootEffect" value="ice"/> <attribute key="shootEffect" value="ice"/>
<attribute key="areaEffect" value="icearea"/> <attribute key="areaEffect" value="icearea"/>
</attack> </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"/> <attribute key="areaEffect" value="bluebubble"/>
</attack> </attack>
</attacks> </attacks>

View File

@ -388,7 +388,9 @@
<movevent event="StepIn" movementid="237" script="nostalrius/237.lua" /> <movevent event="StepIn" movementid="237" script="nostalrius/237.lua" />
<!-- Nostalrius Default Movements --> <!-- Nostalrius Default Movements -->
<movevent event="StepIn" itemid="5404" script="misc/drowning.lua" />
<movevent event="StepOut" itemid="5404" script="misc/drowning.lua"/>
<!-- Floorchange --> <!-- Floorchange -->
<movevent event="StepIn" itemid="293" script="misc/floorchange.lua" /> <movevent event="StepIn" itemid="293" script="misc/floorchange.lua" />
<movevent event="AddItem" itemid="293" tileitem="1" 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 { } else {
return false; 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; return true;

View File

@ -255,6 +255,8 @@ class ConditionDamage final : public Condition
count = max_count = 8; count = max_count = 8;
} else if (type == CONDITION_ENERGY) { } else if (type == CONDITION_ENERGY) {
count = max_count = 10; 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); items[id].conditionDamage.reset(conditionDamage);
} else if (identifier == "poison") { } else if (identifier == "poison") {
conditionDamage = new ConditionDamage(CONDITIONID_COMBAT, CONDITION_POISON); conditionDamage = new ConditionDamage(CONDITIONID_COMBAT, CONDITION_POISON);
conditionDamage->setParam(CONDITION_PARAM_DELAYED, true);
combatType = COMBAT_EARTHDAMAGE; combatType = COMBAT_EARTHDAMAGE;
items[id].combatType = combatType; items[id].combatType = combatType;
items[id].conditionDamage.reset(conditionDamage); items[id].conditionDamage.reset(conditionDamage);

View File

@ -1154,6 +1154,7 @@ void LuaScriptInterface::registerFunctions()
registerEnum(CONDITION_PARAM_STAT_MAXMANAPOINTSPERCENT) registerEnum(CONDITION_PARAM_STAT_MAXMANAPOINTSPERCENT)
registerEnum(CONDITION_PARAM_STAT_MAGICPOINTSPERCENT) registerEnum(CONDITION_PARAM_STAT_MAGICPOINTSPERCENT)
registerEnum(CONDITION_PARAM_PERIODICDAMAGE) registerEnum(CONDITION_PARAM_PERIODICDAMAGE)
registerEnum(CONDITION_PARAM_HIT_DAMAGE)
registerEnum(CONDITION_PARAM_SKILL_MELEEPERCENT) registerEnum(CONDITION_PARAM_SKILL_MELEEPERCENT)
registerEnum(CONDITION_PARAM_SKILL_FISTPERCENT) registerEnum(CONDITION_PARAM_SKILL_FISTPERCENT)
registerEnum(CONDITION_PARAM_SKILL_CLUBPERCENT) registerEnum(CONDITION_PARAM_SKILL_CLUBPERCENT)

View File

@ -876,7 +876,7 @@ void Monster::doAttacking(uint32_t)
for (spellBlock_t& spellBlock : mType->info.attackSpells) { 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 (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(); updateLookDirection();
minCombatValue = spellBlock.minCombatValue; minCombatValue = spellBlock.minCombatValue;
@ -977,7 +977,7 @@ void Monster::onThinkTarget(uint32_t interval)
void Monster::onThinkDefense(uint32_t) void Monster::onThinkDefense(uint32_t)
{ {
for (const spellBlock_t& spellBlock : mType->info.defenseSpells) { 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; minCombatValue = spellBlock.minCombatValue;
maxCombatValue = spellBlock.maxCombatValue; maxCombatValue = spellBlock.maxCombatValue;
spellBlock.spell->castSpell(this, this); spellBlock.spell->castSpell(this, this);