mirror of
https://github.com/ErikasKontenis/SabrehavenServer.git
synced 2025-05-02 02:29:21 +02:00
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:
parent
a28bfd7171
commit
4a87cd754c
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
@ -388,6 +388,8 @@
|
|||||||
<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" />
|
||||||
|
27
data/movements/scripts/misc/drowning.lua
Normal file
27
data/movements/scripts/misc/drowning.lua
Normal 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
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user