Merge branch '22-implement-the-shattered-isles-quest' into 'master'

Resolve "Implement The Shattered Isles Quest"

Closes #22

See merge request ErikasKontenis/Sabrehaven!18
This commit is contained in:
Erikas Kontenis 2019-12-13 14:59:12 +00:00
commit 14fb795807
58 changed files with 896 additions and 24 deletions

View File

@ -85,6 +85,9 @@
<action actionid="82" script="nostalrius/82.lua" />
<action actionid="83" script="nostalrius/83.lua" />
<action actionid="17525" script="meriana_quest/tortoise_egg.lua" />
<action fromaid="17528" toaid="17530" script="meriana_quest/pirate_map.lua" />
<!-- Nostalrius Default Actions -->
<!-- Furniture Parcels -->
<action fromid="2775" toid="2812" script="misc/furniture_parcels.lua" />
@ -174,6 +177,7 @@
<action itemid="4872" script="misc/ice_pick.lua" />
<action itemid="3456" script="misc/pick.lua" />
<action itemid="3457" script="misc/shovel.lua" />
<action itemid="3452" script="misc/rake.lua" />
<action itemid="5710" script="misc/shovel.lua" />
<action itemid="3483" allowfaruse="1" script="misc/fishing_rod.lua" />
<action itemid="5865" script="misc/juice_squeezer.lua" />
@ -279,6 +283,7 @@
<action itemid="3732" script="misc/food.lua" />
<action itemid="5096" script="misc/food.lua" />
<action itemid="5678" script="misc/food.lua" />
<action itemid="6125" script="misc/food.lua" />
<!-- Passthrough -->
<action fromid="2334" toid="2341" script="misc/doors.lua" />

View File

@ -0,0 +1,28 @@
local maps = {
[17528] = "You have successfully read plan A.",
[17529] = "You have successfully read plan B.",
[17530] = "You have successfully read plan C."
}
function onUse(player, item, fromPosition, target, toPosition)
local mapActionId = item:getActionId()
local map = maps[mapActionId]
if not map then
return false
end
local playerPosition = player:getPosition()
if player:getStorageValue(17520) < 8 then
player:say("You shouldn't touch these maps because someone might see you.", TALKTYPE_MONSTER_SAY, false, 0, playerPosition)
return true
end
if player:getStorageValue(mapActionId) ~= 1 then
player:say(map, TALKTYPE_MONSTER_SAY, false, 0, playerPosition)
player:setStorageValue(mapActionId, 1)
else
player:say("You have already read this map.", TALKTYPE_MONSTER_SAY, false, 0, playerPosition)
end
return true
end

View File

@ -0,0 +1,10 @@
function onUse(player, item, fromPosition, target, toPosition)
if player:getStorageValue(17526) < os.time() then
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have found a tortoise egg from Nargor.")
player:setStorageValue(17526, os.time() + 24 * 60 * 60) -- 24 hour
player:addItem(6125,1)
else
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You shoud not take any more today.")
end
return true
end

View File

@ -1,4 +1,10 @@
function onUse(player, item, fromPosition, target, toPosition, isHotkey)
if player:getStorageValue(17520) == 5 and target.itemid == 5601 then
player:setStorageValue(17520, 6)
toPosition:sendMagicEffect(CONST_ME_FIREAREA)
return true
end
local random = math.random(10)
if random >= 4 then --success 6% chance
if target.itemid == 5465 then --Burn Sugar Cane

View File

@ -0,0 +1,12 @@
function onUse(player, item, fromPosition, target, toPosition, isHotkey)
-- The Shattered Isles Parrot ring
if target.itemid == 6094 then
if player:getStorageValue(17502) == 1 and player:getStorageValue(17503) ~= 1 then
toPosition:sendMagicEffect(CONST_ME_POFF)
Game.createItem(6093, 1, Position(32422, 32770, 1))
player:say("You have found a ring.", TALKTYPE_MONSTER_SAY)
player:setStorageValue(17503, 1)
end
end
return true
end

View File

@ -26932,7 +26932,8 @@ Flags = {Take}
Attributes = {Weight=250}
TypeID = 5952
Name = "a scroll"
Name = "a poem scroll"
Description = "It contains a love poem, written by an unknown elven poet."
Flags = {Take}
Attributes = {Weight=120}
@ -27641,7 +27642,7 @@ TypeID = 6093
Name = "a crystal ring"
Description = "The initials E.S. are engraved on it"
Flags = {Take}
Attributes = {Weight=90}
Attributes = {Weight=90,SlotType=RING}
TypeID = 6094
Name = "a thread tree"
@ -27804,9 +27805,9 @@ Attributes = {Weight=1100}
TypeID = 6125
Name = "a tortoise egg from Nargor"
Description = "Handle with care and don't try to eat it" # TODO: Make it eatable and implement from quest details
Description = "Handle with care and don't try to eat it"
Flags = {Take}
Attributes = {Weight=30}
Attributes = {Nutrition=8,Weight=30}
TypeID = 6126
Name = "a peg leg"

View File

@ -14,6 +14,7 @@
<flag canpushcreatures="1" />
<flag targetdistance="1" />
<flag runonhealth="0" />
<flag hidehealth="1"/>
</flags>
<attacks>
<attack name="fire" chance="30" range="7" min="-0" max="-111">

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<monster name="magic pillar" nameDescription="a magic pillar" race="undead" experience="0" speed="0" manacost="0">
<health now="9950" max="9950"/>
<look typeex="2190"/>
<targetchange interval="1000" chance="10" />
<targetstrategy nearest="90" weakest="0" mostdamage="0" random="10" />
<flags>
<flag summonable="0"/>
<flag attackable="1"/>
<flag hostile="1"/>
<flag illusionable="0"/>
<flag convinceable="0"/>
<flag pushable="0"/>
<flag canpushitems="0"/>
<flag canpushcreatures="1"/>
<flag targetdistance="1"/>
<flag hidehealth="1"/>
</flags>
<attacks attack="1" skill="1">
<attack name="poison" min="-50" max="-100" range="7" chance="1">
<attribute key="shootEffect" value="energy" />
<attribute key="areaEffect" value="fire" />
</attack>
</attacks>
<defenses armor="1" defense="1"/>
<immunities>
<immunity fire="1" />
<immunity energy="1" />
<immunity physical="1" />
<immunity outfit="1" />
<immunity lifedrain="1" />
<immunity paralyze="1" />
<immunity poison="1" />
<immunity invisible="1" />
</immunities>
<summons maxSummons="3">
<summon name="demon" interval="1000" chance="10" max="4"/>
</summons>
</monster>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF - 8"?>
<monster name="magicthrower" nameDescription="a magicthrower" race="undead" experience="18" speed="0" manacost="0">
<health now="100" max="100" />
<look typeex="0" />
<look typeex="2190" />
<targetchange interval="1000" chance="0" />
<targetstrategy nearest="100" weakest="0" mostdamage="0" random="0" />
<flags>
@ -15,6 +15,7 @@
<flag canpushcreatures="1" />
<flag targetdistance="1" />
<flag runonhealth="100" />
<flag hidehealth="1"/>
</flags>
<attacks attack="1" skill="1">
<attack name="poison" min="-50" max="-100" range="7" chance="1">

View File

@ -207,4 +207,5 @@
<monster name="tiquandas revenge" file="781/tiquandas revenge.xml" />
<monster name="toad" file="781/toad.xml" />
<monster name="tortoise" file="781/tortoise.xml" />
<monster name="magic pillar" file="781/magic pillar.xml" />
</monsters>

View File

@ -395,6 +395,34 @@
<movevent event="StepIn" itemid="5764" script="misc/drowning.lua" />
<movevent event="StepOut" itemid="5764" script="misc/drowning.lua"/>
<!-- Goroma -->
<movevent event="StepIn" frommovementid="17506" tomovementid="17508" script="goroma/energy_barrier.lua" />
<movevent event="StepIn" movementid="17510" script="goroma/to_ramoa.lua" />
<movevent event="AddItem" movementid="17510" tileitem="1" script="goroma/to_ramoa.lua" />
<movevent event="StepIn" movementid="17511" script="goroma/back_ramoa.lua" />
<movevent event="AddItem" movementid="17511" tileitem="1" script="goroma/back_ramoa.lua" />
<movevent event="StepIn" movementid="17512" script="goroma/to_talahu.lua" />
<movevent event="AddItem" movementid="17512" tileitem="1" script="goroma/to_talahu.lua" />
<movevent event="StepIn" movementid="17513" script="goroma/sacrifice_mushroom_talahu.lua" />
<movevent event="AddItem" movementid="17513" tileitem="1" script="goroma/sacrifice_mushroom_talahu.lua" />
<movevent event="StepIn" movementid="17514" script="goroma/back_sacrifice_mushroom_talahu.lua" />
<movevent event="AddItem" movementid="17514" tileitem="1" script="goroma/back_sacrifice_mushroom_talahu.lua" />
<movevent event="StepIn" movementid="17515" script="goroma/back_talahu.lua" />
<movevent event="AddItem" movementid="17515" tileitem="1" script="goroma/back_talahu.lua" />
<movevent event="StepIn" movementid="17516" script="goroma/to_malada.lua" />
<movevent event="AddItem" movementid="17516" tileitem="1" script="goroma/to_malada.lua" />
<movevent event="StepIn" movementid="17517" script="goroma/back_malada.lua" />
<movevent event="AddItem" movementid="17517" tileitem="1" script="goroma/back_malada.lua" />
<movevent event="StepIn" movementid="17518" script="goroma/back_kharos.lua" />
<movevent event="AddItem" movementid="17518" tileitem="1" script="goroma/back_kharos.lua" />
<movevent event="StepIn" frommovementid="17519" tomovementid="17522" script="goroma/energy_barrier_kharos.lua" />
<movevent event="StepIn" frommovementid="17523" tomovementid="17524" script="goroma/entrance_kharos.lua" />
<movevent event="StepIn" movementid="17525" script="goroma/second_ferumbras_floor.lua" />
<movevent event="AddItem" movementid="17525" tileitem="1" script="goroma/second_ferumbras_floor.lua" />
<movevent event="StepIn" movementid="17526" script="goroma/final_ferumbras_floor.lua" />
<movevent event="AddItem" movementid="17526" tileitem="1" script="goroma/final_ferumbras_floor.lua" />
<movevent event="StepIn" movementid="17527" script="goroma/back_ferumbras_floor.lua" />
<movevent event="AddItem" movementid="17527" tileitem="1" script="goroma/back_ferumbras_floor.lua" />
<!-- Floorchange -->
<movevent event="StepIn" itemid="293" script="misc/floorchange.lua" />
<movevent event="AddItem" itemid="293" tileitem="1" script="misc/floorchange.lua" />
@ -585,6 +613,7 @@
<movevent event="AddItem" itemid="2526" tileitem="1" script="misc/dustbin.lua" />
<movevent event="RemoveItem" itemid="2927" script="misc/candelabrum.lua" />
<movevent event="RemoveItem" itemid="3482" script="misc/open_trap.lua" />
<movevent event="StepIn" frommovementid="51191" tomovementid="51198" script="misc/turtles.lua" />
<!--Doors -->
<movevent event="StepOut" itemid="1643" script="misc/doors.lua" />

View File

@ -0,0 +1,21 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
doRelocate(item:getPosition(),{x = 32121, y = 32709, z = 7})
Game.sendMagicEffect({x = 32121, y = 32709, z = 7}, 11)
local isInGhostMode = player:isInGhostMode()
local spectators = Game.getSpectators(player:getPosition(), false, true, 3, 3)
for i = 1, #spectators do
player:say("This entrance has been sealed by the Edron Academy.", TALKTYPE_MONSTER_SAY, isInGhostMode, spectators[i], player:getPosition())
end
end
function onAddItem(item, tileitem, position)
doRelocate(item:getPosition(),{x = 32121, y = 32709, z = 7})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 32121, y = 32709, z = 7}, 11)
end

View File

@ -0,0 +1,16 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
doRelocate(item:getPosition(),{x = 32101, y = 32545, z = 07})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 32101, y = 32545, z = 07}, 11)
end
function onAddItem(item, tileitem, position)
doRelocate(item:getPosition(),{x = 32101, y = 32545, z = 07})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 32101, y = 32545, z = 07}, 11)
end

View File

@ -0,0 +1,21 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
if player:getStorageValue(17512) ~= 1 then
player:setStorageValue(17512, 1)
return true
end
doRelocate(item:getPosition(),{x = 31919, y = 32659, z = 08})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31919, y = 32659, z = 08}, 11)
end
function onAddItem(item, tileitem, position)
doRelocate(item:getPosition(),{x = 31919, y = 32659, z = 08})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31919, y = 32659, z = 08}, 11)
end

View File

@ -0,0 +1,21 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
if player:getStorageValue(17510) ~= 1 then
player:setStorageValue(17510, 1)
return true
end
doRelocate(item:getPosition(),{x = 32036, y = 32558, z = 08})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 32036, y = 32558, z = 08}, 11)
end
function onAddItem(item, tileitem, position)
doRelocate(item:getPosition(),{x = 32036, y = 32558, z = 08})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 32036, y = 32558, z = 08}, 11)
end

View File

@ -0,0 +1,11 @@
function onStepIn(creature, item, position, fromPosition)
doRelocate(item:getPosition(),{x = 31919, y = 32594, z = 10})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31919, y = 32594, z = 10}, 11)
end
function onAddItem(item, tileitem, position)
doRelocate(item:getPosition(),{x = 31919, y = 32594, z = 10})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31919, y = 32594, z = 10}, 11)
end

View File

@ -0,0 +1,21 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
if player:getStorageValue(17511) ~= 1 then
player:setStorageValue(17511, 1)
return true
end
doRelocate(item:getPosition(),{x = 31948, y = 32554, z = 08})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31948, y = 32554, z = 08}, 11)
end
function onAddItem(item, tileitem, position)
doRelocate(item:getPosition(),{x = 31948, y = 32554, z = 08})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31948, y = 32554, z = 08}, 11)
end

View File

@ -0,0 +1,16 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
if player:getStorageValue(17509) < 5 then
position:sendMagicEffect(CONST_ME_ENERGYHIT)
position.x = position.x + 2
player:teleportTo(position)
return true
end
return true
end

View File

@ -0,0 +1,25 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
if player:getStorageValue(17513) ~= 2 then
player:setStorageValue(17513, 1)
doRelocate(item:getPosition(),{x = 32121, y = 32709, z = 7})
Game.sendMagicEffect({x = 32121, y = 32709, z = 7}, 11)
local isInGhostMode = player:isInGhostMode()
local spectators = Game.getSpectators(player:getPosition(), false, true, 3, 3)
for i = 1, #spectators do
player:say("This entrance has been sealed by the Edron Academy.", TALKTYPE_MONSTER_SAY, isInGhostMode, spectators[i], player:getPosition())
end
return true
end
doRelocate(item:getPosition(),{x = 32121, y = 32703, z = 7})
Game.sendMagicEffect({x = 32121, y = 32703, z = 7}, 11)
player:setStorageValue(17513, 1)
return true
end

View File

@ -0,0 +1,11 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
position.y = position.y - 1
player:teleportTo(position)
return true
end

View File

@ -0,0 +1,16 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
doRelocate(item:getPosition(),{x = 32121, y = 32693, z = 04})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 32121, y = 32693, z = 04}, 11)
end
function onAddItem(item, tileitem, position)
doRelocate(item:getPosition(),{x = 32121, y = 32693, z = 04})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 32121, y = 32693, z = 04}, 11)
end

View File

@ -0,0 +1,31 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
if Game.isItemThere({x = 31918, y = 32598, z = 10},3723) and Game.isItemThere({x = 31918, y = 32599, z = 10},3725) and Game.isItemThere({x = 31920, y = 32598, z = 10},3732) and Game.isItemThere({x = 31920, y = 32599, z = 10},3728) then
Game.sendMagicEffect({x = 31918, y = 32598, z = 10}, 15)
Game.removeItemOnMap({x = 31918, y = 32598, z = 10}, 3723)
Game.sendMagicEffect({x = 31918, y = 32599, z = 10}, 15)
Game.removeItemOnMap({x = 31918, y = 32599, z = 10}, 3725)
Game.sendMagicEffect({x = 31920, y = 32598, z = 10}, 15)
Game.removeItemOnMap({x = 31920, y = 32598, z = 10}, 3732)
Game.sendMagicEffect({x = 31920, y = 32599, z = 10}, 15)
Game.removeItemOnMap({x = 31920, y = 32599, z = 10}, 3728)
doRelocate(item:getPosition(),{x = 31914, y = 32605, z = 10})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31914, y = 32605, z = 10}, 11)
else
doRelocate(item:getPosition(),{x = 31919, y = 32597, z = 10})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31919, y = 32597, z = 10}, 11)
end
end
function onAddItem(item, tileitem, position)
doRelocate(item:getPosition(),{x = 31915, y = 32606, z = 10})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31915, y = 32606, z = 10}, 11)
end

View File

@ -0,0 +1,16 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
doRelocate(item:getPosition(),{x = 32124, y = 32694, z = 05})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 32124, y = 32694, z = 05}, 11)
end
function onAddItem(item, tileitem, position)
doRelocate(item:getPosition(),{x = 32124, y = 32694, z = 05})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 32124, y = 32694, z = 05}, 11)
end

View File

@ -0,0 +1,22 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
if player:getStorageValue(17512) ~= 1 then
Game.sendMagicEffect({x = 31926, y = 32656, z = 08}, 11)
player:teleportTo({x = 31926, y = 32656, z = 08})
return true
end
doRelocate(item:getPosition(),{x = 32021, y = 32680, z = 08})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 32021, y = 32680, z = 08}, 11)
end
function onAddItem(item, tileitem, position)
doRelocate(item:getPosition(),{x = 32021, y = 32680, z = 08})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 32021, y = 32680, z = 08}, 11)
end

View File

@ -0,0 +1,22 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
if player:getStorageValue(17510) ~= 1 then
Game.sendMagicEffect({x = 32043, y = 32559, z = 08}, 11)
player:teleportTo({x = 32043, y = 32559, z = 08})
return true
end
doRelocate(item:getPosition(),{x = 31948, y = 32554, z = 08})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31948, y = 32554, z = 08}, 11)
end
function onAddItem(item, tileitem, position)
doRelocate(item:getPosition(),{x = 31948, y = 32554, z = 08})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31948, y = 32554, z = 08}, 11)
end

View File

@ -0,0 +1,22 @@
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
if player:getStorageValue(17511) ~= 1 then
Game.sendMagicEffect({x = 31951, y = 32555, z = 08}, 11)
player:teleportTo({x = 31951, y = 32555, z = 08})
return true
end
doRelocate(item:getPosition(),{x = 31919, y = 32659, z = 08})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31919, y = 32659, z = 08}, 11)
end
function onAddItem(item, tileitem, position)
doRelocate(item:getPosition(),{x = 31919, y = 32659, z = 08})
item:getPosition():sendMagicEffect(11)
Game.sendMagicEffect({x = 31919, y = 32659, z = 08}, 11)
end

View File

@ -74,7 +74,7 @@ local list = {
[5258] = {x = 0, y = -1, z = -1},
[5259] = {x = -1, y = 0, z = -1},
[5544] = {x = 0, y = 0, z = 1},
[5691] = {x = 0, y = 0, z = 1},
[5691] = {x = 1, y = 0, z = 1},
[5731] = {x = 0, y = 0, z = 1},
[5763] = {x = 0, y = 0, z = 1},
}

View File

@ -0,0 +1,34 @@
local config = {
[51191] = Position(32359, 32901, 7),
[51192] = Position(32340, 32538, 7),
[51193] = Position(32472, 32869, 7),
[51194] = Position(32415, 32916, 7),
[51195] = Position(32490, 32979, 7),
[51196] = Position(32440, 32971, 7),
[51197] = Position(32523, 32923, 7),
[51198] = Position(32527, 32951, 7)
}
function onStepIn(creature, item, position, fromPosition)
local player = creature:getPlayer()
if not player then
return true
end
local targetPosition = config[item:getMovementId()]
if not targetPosition then
return true
end
if item:getMovementId() == 51191 and player:getStorageValue(17502) < 13 then
player:teleportTo(Position(32340, 32540, 7))
position:sendMagicEffect(CONST_ME_TELEPORT)
Position(32340, 32540, 7):sendMagicEffect(CONST_ME_TELEPORT)
return true
end
player:teleportTo(targetPosition)
position:sendMagicEffect(CONST_ME_TELEPORT)
targetPosition:sendMagicEffect(CONST_ME_TELEPORT)
return true
end

View File

@ -6,7 +6,7 @@ Home = [32417,31583,7]
Radius = 3
Behaviour = {
ADDRESS,"hello$",! -> "Hi."
ADDRESS,"hello$",! -> "Whatcha do in my place?"
ADDRESS,"hi$",! -> *
ADDRESS,! -> Idle
BUSY,"hello$",! -> "Wait, %N.", Queue
@ -17,5 +17,7 @@ VANISH,! -> NOP
"bye" -> "Bye.", Idle
"farewell" -> *
"fight" -> "You. Weak."
"job" -> "No time for such a stupid thing."
"name" -> "Ajax."
}

View File

@ -16,10 +16,13 @@ VANISH,! -> "Good bye."
"bye" -> "Good bye.", Idle
"buy" -> "I can offer you food."
"drinks" -> "Well, we usually drink around here, but right now we're running dry. However, I sell juice squeezers to make fruit juice."
"tavern" -> "I can offer you food and drinks. I also offer juice squeezers."
"buy" -> *
"do","you","sell" -> *
"do","you","have" -> *
"food" -> "Are you looking for food? I have banana, blueberry, cheese, mango, meat, melon, orange, pear, pumpkin, red apple and strawberry."
"food" -> "Are you looking for food? I have cheese, ham and meat as well as a variety of fruits."
"fruits" -> "I have bananas, apples, oranges, strawberries, melons, pumpkin, blueberries, mangoes and pears, sweety."
"banana" -> Type=3587, Amount=1, Price=5, "Do you want to buy a banana for %P gold?", Topic=1
"blueberry" -> Type=3588, Amount=1, Price=1, "Do you want to buy blueberry for %P gold?", Topic=1
@ -52,4 +55,23 @@ VANISH,! -> "Good bye."
Topic=1,"yes",CountMoney>=Price -> "Here it is.", DeleteMoney, Create(Type)
Topic=1,"yes" -> "I am sorry, but you do not have enough gold."
Topic=1 -> "Maybe later."
"mission",QuestValue(17520)=1,QuestValue(17521)=0 -> "You know, we have plenty of rum here but we lack some basic food. Especially food that easily becomes mouldy is a problem. Bring me 100 breads and you will help me a lot.", SetQuestValue(17521,1)
"mission",QuestValue(17521)=1 -> Type=3600, Amount=100, "Are you here to bring me the 100 pieces of bread that I requested?", Topic=2
"bread",QuestValue(17521)=1 -> *
Topic=2,"yes",Count(Type)>=Amount -> "What a joy. At least for a few days adequate supply is ensured.", Delete(Type), SetQuestValue(17521,2)
Topic=2,"yes" -> "Sorry, you do not have so many."
Topic=2 -> "Maybe another time."
"mission",QuestValue(17521)=2 -> "The sailors always tell tales about the famous beer of Carlin. You must know, alcohol is forbidden in that city. ...",
"The beer is served in a secret whisper bar anyway. Bring me a sample of the whisper beer, NOT the usual beer but whisper beer. I hope you are listening.", SetQuestValue(17521,3)
"mission",QuestValue(17521)=3 -> Type=6106, Amount=1, "Did you get a sample of the whisper beer from Carlin?", Topic=3
"bread",QuestValue(17521)=1 -> *
Topic=3,"yes",Count(Type)>=Amount -> "Thank you very much. I will test this beauty in privacy.", Delete(Type), SetQuestValue(17521,4)
Topic=3,"yes" -> "Sorry, you do not have it."
Topic=3 -> "Maybe another time."
"mission" -> "Sorry, I don't have any missions for you."
}

View File

@ -21,12 +21,15 @@ VANISH,! -> "Oh well."
"sail" -> "Where do you want to go? To Treasure Island?"
"passage" -> *
"treasure island" -> Price=200, "Do you seek a passage to Treasure Island for %P?", Topic=1
"treasure","island" -> Price=200, "Do you seek a passage to Treasure Island for %P?", Topic=1
"peg","leg",QuestValue(17502)>5 -> Price=50, "Ohhhh. So... <lowers his voice> 'you know who' sent you so I sail you to 'you know where'. <wink> <wink> It will cost 50 gold to cover my expenses. Is it that what you wish?", Topic=2
Topic=1,"yes",PZBlock,! -> "First get rid of those blood stains! You are not going to ruin my vehicle!"
Topic=2,"yes",PZBlock,! -> "First get rid of those blood stains! You are not going to ruin my vehicle!"
Topic=1,"yes",Premium,CountMoney>=Price -> "Set the sails!", DeleteMoney, Idle, EffectOpp(11), Teleport(32132,32913,7), EffectOpp(11)
Topic=2,"yes",Premium,CountMoney>=Price -> "Set the sails!", DeleteMoney, Idle, EffectOpp(11), Teleport(32348,32625,7), EffectOpp(11)
Topic>0,"yes",CountMoney>=Price -> "I'm sorry, but you need a premium account in order to travel onboard our ships."
Topic>0,"yes" -> "You don't have enough money."
Topic>0 -> "We would like to serve you some time."

View File

@ -113,4 +113,9 @@ Topic=3,"yes",CountMoney<Price -> "Sorry, you do not have enough gold
Topic=3,"yes" -> "Here you are. Look in your spellbook for the pronunciation of this spell.", DeleteMoney, EffectOpp(13), TeachSpell(String)
Topic=3 -> "Maybe next time."
"mission",QuestValue(17502)=3 -> Price=200, "Oh, so you brought some gold from Eleonore to me?", Topic=4
"errand",QuestValue(17502)=3 -> *
Topic=4,"yes" -> "Hmm, it seems that Eleonore does trust you. Perhaps she is even right. However. Since we need some help right now I guess we can't be too picky. Return to Eleonore and tell her the secret password: 'peg leg'. She will tell you more about her problem.", DeleteMoney, SetQuestValue(17502,4)
Topic=4 -> "Hmm, interesting how do you even know about the errand then..."
}

View File

@ -47,4 +47,51 @@ VANISH,! -> "Good bye."
"banana" -> "A banana staff is the sign of a high ape magician."
"pirates" -> "You have to understand that there are two groups of people that are called pirates. One consists of evil thieves and murderers for whom the word pirate actually stands for. ...",
"The others are resistance fighters for whom old ideals are hold true and that are the assertors of the native people."
"spellbook",QuestValue(17509)=0,Count(6120)>=1 -> "Ah, thank you very much! I will honour his memory.", Amount=1, Delete(6120), SetQuestValue(17509,1)
"counterspell",QuestValue(17509)=0 -> "You should not talk about things you don't know anything about."
"energy","field",QuestValue(17509)=0 -> *
"spellbook",QuestValue(17509)=0 -> *
"energy","field",QuestValue(17509)>0 -> "Ah, the energy barrier set up by the cult is maintained by lousy magic, but is still effective. Without a proper counterspell you won't be able to pass it."
"counterspell",QuestValue(17509)=1 -> "You mean, you are interested in a counterspell to cross the energy barrier on Goroma?", Topic=1
Topic=1,"yes" -> "This is really not advisable. Behind this barrier, strong forces are raging violently. Are you sure that you want to go there?", Topic=2
Topic=1 -> "It's much safer for you to stay here anyway, trust me."
Topic=2,"yes" -> "I guess I cannot stop you then. Since you told me about my apprentice, it is my turn to help you. I will perform a ritual for you, but I need a few ingredients. ...",
"Bring me one fresh dead chicken, one fresh dead rat and one fresh dead black sheep, in that order. Summoned ones will do as well as natural ones.", SetQuestValue(17509,2)
Topic=2 -> "It's much safer for you to stay here anyway, trust me."
"counterspell",QuestValue(17509)=2 -> Type=4330, Amount=1, "Did you bring the fresh dead chicken?", Topic=3
"chicken",QuestValue(17509)=2 -> *
Topic=3,"yes",Count(Type)>=Amount -> "Very good! <mumblemumble> 'Your soul shall be protected!' Now, I need a fresh dead rat.", Delete(Type), SetQuestValue(17509,3)
Topic=3,"yes" -> "You don't have any dead chicken with you don't you?"
Topic=3 -> "Maybe another time."
"counterspell",QuestValue(17509)=3 -> Type=3994, Amount=1, "Did you bring the fresh dead rat?", Topic=4
"rat",QuestValue(17509)=3 -> *
Topic=4,"yes",Count(Type)>=Amount -> "Very good! <chants and dances> 'You shall face black magic without fear!' Now, I need a fresh dead black sheep.", Delete(Type), SetQuestValue(17509,4)
Topic=4,"yes" -> "You don't have any dead rat with you don't you?"
Topic=4 -> "Maybe another time."
"counterspell",QuestValue(17509)=4 -> Type=4095, Amount=1, "Did you bring the fresh dead black sheep?", Topic=5
"sheep",QuestValue(17509)=4 -> *
Topic=5,"yes",Count(Type)>=Amount -> "Very good! <stomps staff on ground> 'EVIL POWERS SHALL NOT KEEP YOU ANYMORE! SO BE IT!'", Delete(Type), SetQuestValue(17509,5)
Topic=5,"yes" -> "You don't have any dead black sheep with you don't you?"
Topic=5 -> "Maybe another time."
"counterspell",QuestValue(17509)>4 -> "Hm. I don't think you need another one of my counterspells to cross the barrier on Goroma."
"mission",QuestValue(17520)=1,QuestValue(17524)=0 -> "The evil cult has placed a curse on one of the captains here. I need at least five of their pirate voodoo dolls to lift that curse.", SetQuestValue(17524,1)
"mission",QuestValue(17524)>0,QuestValue(17524)<5 -> Type=5810, Amount=1, "Did you bring one of the required pirate voodoo dolls?", Topic=6
"doll",QuestValue(17524)>0,QuestValue(17524)<5 -> *
"mission",QuestValue(17524)=5 -> Type=5810, Amount=1, "Did you bring the last of the required voodoo dolls?", Topic=6
"doll",QuestValue(17524)=5, -> *
Topic=6,"yes",Count(Type)>=Amount -> "Now I can weaken that curse a bit. Thank you.", Delete(Type), SetQuestValue(17524,QuestValue(17524)+1)
Topic=6,"yes",Count(Type)>=Amount,QuestValue(17524)=5 -> "Finally I can put an end to that curse. I thank you so much.", Delete(Type), SetQuestValue(17524,QuestValue(17524)+1)
Topic=6,"yes" -> "Sorry, you do not have it."
Topic=6 -> "Maybe another time."
"mission" -> "Sorry, I don't have any missions for you."
}

View File

@ -26,4 +26,27 @@ VANISH,! -> "Bye"
Topic=1,"yes",CountMoney>=Price -> "Here you go. Those would fit nicely into your house, showing that you're a fan and supporter and all that.", DeleteMoney, Create(Type)
Topic=1,"yes" -> "Come back when you have enough money."
Topic=1 -> "Maybe next time."
"mission",QuestValue(17520)=1,QuestValue(17523)=0 -> "I need a new quality atlas for our captains. Only one of the best will do it. I heard the explorers society sells the best, but only to members of a certain rank. You will have to get this rank or ask a high ranking member to buy it for you.", SetQuestValue(17523,1)
"mission",QuestValue(17523)=1 -> Type=6108, Amount=1, "Did you get an atlas of the explorers society as I requested?", Topic=2
"atlas",QuestValue(17523)=1 -> *
Topic=2,"yes",Count(Type)>=Amount -> "Indeed, what a fine work... the book I mean. Your work was acceptable all in all.", Delete(Type), SetQuestValue(17523,2)
Topic=2,"yes" -> "Sorry, you do not have it."
Topic=2 -> "Maybe another time."
"mission",QuestValue(17525)=0,QuestValue(17520)>4 -> "You did some impressive things. I think people here start considering you as one of us. But these are dire times and everyone of us is expected to give his best and even exceed himself. Do you think you can handle that?", Topic=3
Topic=3,"yes" -> "I am glad to hear this. Please listen. The pirates on Nargor are breeding tortoises. They think eating tortoises makes a hard man even harder. ...",
"However I am quite fond of tortoises and can't stand the thought of them being eaten. So I convinced Captain Striker that I can train them to help us. As a substitute for rafts and such ...",
"All I need is one tortoise egg from Nargor. This is the opportunity to save a tortoise from a gruesome fate! ...",
"I will ask Sebastian to bring you there. Travel to Nargor, find their tortoise eggs and bring me at least one of them.", SetQuestValue(17525,1)
Topic=3 -> "Maybe another time."
"mission",QuestValue(17525)=1 -> Type=6125, Amount=1, "Did you rescue one of those poor soon-to-be baby tortoises from Nargor?", Topic=4
"egg",QuestValue(17525)=1 -> *
Topic=4,"yes",Count(Type)>=Amount -> "A real tortoise egg ... I guess you are more accustomed to rescue some noblewoman in distress but you did something good today.", Delete(Type), SetQuestValue(17525,2)
Topic=4,"yes" -> "Sorry, you do not have it."
Topic=4 -> "Maybe another time."
"mission" -> "Sorry, I don't have any missions for you."
}

View File

@ -17,4 +17,41 @@ VANISH,! -> "Oh well."
"bye" -> "Good bye.", Idle
"farewell" -> *
"ring",QuestValue(17502)=0 -> "My ring was stolen by a parrot, directly from my dressing table near the window. It flew to the nearby mountains and I fear my ring will be lost forever. Whoever returns it to me will be rewarded generously. ...",
"I guess that evil parrot hid the ring somewhere on a high tree or a rock so that you might need a rake to get it.", SetQuestValue(17502,1)
"mission",QuestValue(17502)=0 -> *
"ring",QuestValue(17502)=1 -> Type=6093, Amount=1, Price=150, "Oh, my beloved ring! Have you found it and want to return it to me?", Topic=1
"mission",QuestValue(17502)=1 -> *
Topic=1,"yes",Count(Type)>=Amount -> "Oh, thank you so much! Take this gold as a reward. ... which reminds me, I would need some help in another matter. It is only a small errand. Are you interested?", Delete(Type), CreateMoney, SetQuestValue(17502,2), Topic=2
Topic=1,"yes" -> "You don't have it!"
Topic=1 -> "Too bad."
"ring",QuestValue(17502)=2 -> Price=200, "I would need some help in another matter. It is only a small errand. Are you interested?", Topic=3
"mission",QuestValue(17502)=2 -> *
"errand",QuestValue(17502)=2 -> *
Topic=2,"yes" -> Price=200, "Thank you! It is not a difficult matter but a rather urgent one. I need to send some money to a person in town. Would you be willing to run this small errand for me?", Topic=3
Topic=2 -> "Too bad."
Topic=3,"yes" -> "I was hoping that you'd agree. Please deliver these 200 gold pieces to the herbalist Charlotta in the south-western part of the town. If you return from this errand, I will grant you 5 gold pieces as reward for your efforts.", CreateMoney, SetQuestValue(17502,3)
Topic=3 -> "Too bad."
"mission",QuestValue(17502)=3 -> "Charlotta is still waiting for your delivery."
"errand",QuestValue(17502)=3 -> *
"mission",QuestValue(17502)=4 -> Price=5, "Great, thank you! As promised, here are your 5 gold pieces. Is there ... anything left that you might want to discuss with me?", CreateMoney, SetQuestValue(17502,5)
"errand",QuestValue(17502)=4 -> *
"peg","leg",QuestValue(17502)=5 -> "You have returned my ring and proven yourself as trustworthy. There is something I have to discuss with you. Are you willing to listen?", Topic=4
Topic=4,"yes" -> "I am glad to hear that. So please listen: Due to circumstances too complicated to explain now, I met Captain Ray Striker. He is ... a freedom fighter and would not find my father's acceptance, but we fell in love ...",
"Even though he had to hide for a while, we have stayed in contact for a long time now. And our love grew even further against all odds ...",
"However, recently we lost contact. I don't know what has happened to him and fear the worst ...",
"We always have been aware that something terrible might happen to him due to his lifestyle. But perhaps there is a harmless explanation for the absence of messages <holds her tears back>. I have arranged a passage for you to Ray's hiding place ...",
"Contact Captain Waverider, the old fisherman, and tell him the secret word 'peg leg'. He will make sure that you arrive safely ...",
"Please look for Ray and find out what happened to him and why he was not able to answer. Return to me as soon as you have found something out. I wish you a good journey.", SetQuestValue(17502,6)
Topic=4 -> "Too bad."
"ray","striker",QuestValue(17502)=13 -> "<blushes> Oh, he is so wonderful. A very special man with a special place in my heart.", Topic=5
Topic=5,"mermaid" -> "I can't thank you enough for freeing my beloved Ray from that evil spell. I am still shocked that a mermaid could steal his love that easily.", SetQuestValue(17502,14)
}

View File

@ -79,6 +79,7 @@ Topic=2 -> "Maybe you will buy it another time."
"lute" -> Type=2950, Amount=1, Price=195, "Do you want to buy a lute for %P gold?", Topic=1
"drum" -> Type=2952, Amount=1, Price=140, "Do you want to buy a drum for %P gold?", Topic=1
"simple","fanfare" -> Type=2954, Amount=1, Price=150, "Do you want to buy a simple fanfare for %P gold?", Topic=1
"love","peom" -> Type=5952, Amount=1, Price=200, "Do you want to buy a love poem for %P gold?", Topic=1
%1,1<%1,"lyre" -> Type=2949, Amount=%1, Price=120*%1, "Do you want to buy %A lyre for %P gold?", Topic=1
%1,1<%1,"lute" -> Type=2950, Amount=%1, Price=195*%1, "Do you want to buy %A lute for %P gold?", Topic=1

View File

@ -122,6 +122,7 @@ Topic=5,"yes",CountMoney<Price,! -> "Oh. You do not have enough money
Topic=5,"yes",! -> "So receive the wisdom of solitude, pilgrim", DeleteMoney, EffectOpp(13), SetQuestValue(101,1), Bless(4)
Topic=5,! -> "Ok. As you wish."
"letter",QuestValue(17522)=1,Count(6113)>=1 -> "A letter from that youngster Morgan? I believed him dead since years. These news are good news indeed. Thank you very much, my friend.", DeleteAmount(6113, 1), SetQuestValue(17522,2)
"letter" -> "I am not waiting for any letters from strangers."
}

View File

@ -322,3 +322,17 @@ Topic=56,"yes",CountMoney>=Price -> "Here, better don't lose it.", DeleteMoney,
Topic=56,"yes" -> "Sorry, you don't have the money for this transaction."
Topic=56 -> "Is there anything else I can do for you?"
######################
"atlas" -> Amount=1, Type=6108, Price=150, "Do you want to buy an atlas for %P gold?", Topic=57
Topic=57,"yes",QuestValue(300)<5 -> "Oh, sorry but we sell atlas only for members with a special rank."
Topic=57,"yes",CountMoney>=Price -> "Here you are.", DeleteMoney, Create(Type)
Topic=57,"yes" -> "Sorry, you don't have the money for this transaction."
Topic=57 -> "Is there anything else I can do for you?"
%1,1<%1,"atlas" -> Amount=%1, Type=6108, Price=150*%1, "Do you want to buy %A atlas for %P gold?", Topic=58
Topic=58,"yes",QuestValue(300)<5 -> "Oh, sorry but we sell atlas only for members with a special rank."
Topic=58,"yes",CountMoney>=Price -> "Here you are.", DeleteMoney, Create(Type)
Topic=58,"yes" -> "Sorry, you don't have the money for this transaction."
Topic=58 -> "Is there anything else I can do for you?"

View File

@ -38,6 +38,7 @@ VANISH,! -> "Please come back, but don't tell others."
"hugo" -> "I think Todd mentioned a Hugo once."
"news" -> "Some travelers from Edron told about a great treasure guarded by cruel demons in the dungeons there."
"rumors" -> *
"whisper","beer",QuestValue(17521)=3 -> Type=6106, Amount=1, Price=80, "Do you want to buy a bottle of our finest whisper beer for %P gold?", Topic=1
"beer" -> Type=2880, Data=3, Amount=1, Price=20, "Do you want to buy a mug of beer for %P gold?", Topic=1
Topic=1,"yes",CountMoney>=Price -> "Here. Don't take it into the city though.", DeleteMoney, Create(Type)
Topic=1,"yes" -> "Sorry, come back with more gold."

View File

@ -12,7 +12,7 @@ ADDRESS,! -> Idle
BUSY,"hello$",! -> "Wait a moment, %N. I'll be here soon.", Queue
BUSY,"hi$",! -> *
BUSY,! -> NOP
VANISH,! -> "Arrr!"
VANISH,! -> "Whenever your throat is dry, you know where to find my tavern."
"bye" -> "Whenever your throat is dry, you know where to find my tavern.", Idle
"farewell" -> *
@ -51,4 +51,14 @@ Topic=5,"no" -> "Oh come on, don't be a child."
Topic=4,"yes",CountMoney>=100,Amount=6 -> Price=100, Type=5792, Amount=1, "Ok, here we go ... 6! You have won a dice, congratulations. One more game?", DeleteMoney, Create(Type), EffectMe(27), Topic=5
Topic=4,"yes",CountMoney>=100 -> Price=100, "Ok, here we go ... %A! You have lost. Har Har Har. One more game?", DeleteMoney, EffectMe(27), Topic=5
Topic=4,"yes" -> "You don't have so much money."
"mission",QuestValue(17520)=9,QuestValue(17531)=0 -> "Hmm, you look like a seasoned seadog. Kill Captain Ray Striker, bring me his lucky pillow as a proof and you are our hero!", SetQuestValue(17531,1)
"mission",QuestValue(17531)=1 -> Type=6105, Amount=1, "Do you have Striker's pillow?", Topic=7
"pillow",QuestValue(17531)=1 -> *
Topic=7,"yes",Count(Type)>=Amount -> "You DID it!!! Incredible! Boys, lets have a PAAAAAARTY!!!!", Delete(Type), SetQuestValue(17531,2)
Topic=7,"yes" -> "No you not!"
Topic=7 -> "Maybe another time."
"mission" -> "Sorry, I don't have any missions for you."
}

View File

@ -6,7 +6,7 @@ Home = [32329,32528,7]
Radius = 0
Behaviour = {
ADDRESS,"hello$",! -> "You wouldn't keep a pretty lady like me waiting, would you?"
ADDRESS,"hello$",! -> "Oh, hello %N. A visitor, how nice!"
ADDRESS,"hi$",! -> *
ADDRESS,! -> Idle
BUSY,"hello$",! -> "Wait a second please, %N.", Queue
@ -16,4 +16,29 @@ VANISH,! -> "How rude."
"bye" -> "Good bye, %N.", Idle
# The Mermaid Marina Quest
"silk","yarn",QuestValue(17504)=0 -> "Um. You mean, you really want me to touch that gooey spider silk just because you need yarn? Well... do you think that I'm pretty?", Topic=1
Topic=1,"yes" -> "Well, everyone would say that in your position. Do you think that I'm really, absolutely the most stunning being that you have ever seen?", Topic=2
Topic=1 -> "Get out of there!"
Topic=2,"yes" -> "<giggles> It's funny how easy it is to get humans to say what you want. Now, proving it will be even more fun! ...",
"You want me to touch something gooey, so you have to touch something gooey for me too. <giggles> ...",
"I love honey and I haven't eaten it in a while, so bring me 50 honeycombs and worship my beauty a little more, then we will see.", SetQuestValue(17504,1)
Topic=2 -> "Get out of there!"
"honeycomb",QuestValue(17504)=1 -> Type=5902, Amount=50, "Did you bring me the 50 honeycombs I requested and do you absolutely admire my beauty?", Topic=3
Topic=3,"yes",Count(Type)>=Amount -> "Oh goodie! Thank you! Okay... I guess since my fingers are sticky now anyway, I will help you. From now on, if you bring me 10 pieces of spider silk, I will create one spool of yarn.", Delete(Type), SetQuestValue(17504,2)
Topic=3,"yes" -> "Sorry, you do not have so many."
Topic=3 -> "Maybe another time."
"silk","yarn",QuestValue(17504)=2 -> Type=5879, Amount=10, "Okay... a deal is a deal, would you like me to create a spool of yarn from 10 pieces of spider silk?", Topic=4
Topic=4,"yes",Count(Type)>=Amount -> "Ew... gooey... there you go.", Delete(Type), Amount=1, Create(5886)
Topic=4,"yes" -> "Sorry, you do not have so many."
Topic=4 -> "Maybe another time."
#The Shattered Isles Quest
"Raymond","Striker",QuestValue(17502)=7 -> "<giggles> I think he has a crush on me. Well, silly man, it is only for his own good. This way he can get accustomed to TRUE beauty. And I won't give him up anymore now that he is mine.", SetQuestValue(17502,8)
"date",QuestValue(17502)=9 -> "Is that the best you can do? A true Djinn would have done something more poetic.", SetQuestValue(17502,10)
"date",QuestValue(17502)=12 -> "This lovely, exotic Djinn is a true poet. And he is asking me for a date? Excellent. Now I can finaly dump this human pirate. He was growing to be boring more and more with each day ...",
"As a little reward for your efforts I allow you to ride my sea turtles. Just look around at the shores and you will find them.", SetQuestValue(17502,13)
}

View File

@ -17,4 +17,13 @@ VANISH,! -> "Good bye."
"bye" -> "Good bye.", Idle
"farewell" -> *
"mission",QuestValue(17520)=1,QuestValue(17522)=0 -> Type=6113, Amount=1, "Hm, if you are that eager to work I have an idea how you could help me out. A distant relative of mine, the old sage Eremo lives on the isle Cormaya, near Edron. ...",
"He has not heard from me since ages. He might assume that I am dead. Since I don't want him to get into trouble for receiving a letter from a pirate I ask you to deliver it personally. ...",
"Of course it's a long journey but you asked for it. You will have to prove us your worth. Are you up to that?", Topic=1
Topic=1,"yes" -> "Alright, we will see. Here, take this letter and deliver it safely to old Eremo on Cormaya.", Create(Type), SetQuestValue(17522,1)
Topic=1 -> "Maybe another time."
"mission",QuestValue(17522)=1 -> "Please deliver my letter to Eremo as fast as you can."
"mission",QuestValue(17522)=2 -> "Thank you for delivering my letter to Eremo. I have no more missions for you.", SetQuestValue(17522,3)
"mission" -> "Sorry, I don't have any missions for you."
}

View File

@ -27,8 +27,23 @@ VANISH,! -> "Farewell, human."
"king" -> "Human kings come and go. Djinns are not such short-lived creatures and don't care much about humans."
"thais" -> "The noisy human cities are of absolutely no interest for me."
"raymond striker" -> "Now that Marina and me have arranged a date, I hope this human is forgotten soon."
"marina" -> "Marina and I have arranged a date already, I am so excited."
"marina",QuestValue(17502)>12 -> "Marina and I have arranged a date already, I am so excited."
"pirates" -> "Many humans sail the seas, I can't tell them apart. You humans look all the same to me."
"voodoo" -> "Some humans are tapping the energy of these isles with some strange results. Perhaps that explains the voodoo we've heard about."
"Eleonore",QuestValue(17502)=8 -> "I heard the birds sing about her beauty. But how could a human rival the enchanting beauty of a mermaid?", Topic=1
Topic=1,"mermaid" -> "Oh yes, I noticed that lovely mermaid. From afar of course. I would not dare to step into the eyes of such a lovely creature. ...",
"I guess I am quite shy. Oh my, if I were not blue, I would turn red now. If there would be someone to arrange a date with her.", Topic=2
Topic=2,"date" -> "Will you ask the mermaid Marina if she would date me?", Topic=3
Topic=3,"yes" -> "Thank you. How ironic, a human granting a djinn a wish.", SetQuestValue(17502,9)
Topic=3, -> "Too bad."
"mermaid",QuestValue(17502)=10 -> "Oh my. Its not easy to impress a mermaid I guess. Please get me a love poem. I think elves are the greatest poets so their city seems like a good place to look for one.", SetQuestValue(17502,11)
"marina",QuestValue(17502)=10 -> *
"love","poem",QuestValue(17502)=11 -> Type=5952, Amount=1, "Did you get a love poem from Ab'Dendriel?", Topic=4
Topic=4,"yes",Count(Type)>=Amount -> "Excellent. Here, with this little spell I enable you to recite the poem like a true elven poet. Now go and ask her for a date again.", SetQuestValue(17502,12)
Topic=4,"yes" -> "It looks like you forgot it somewhere."
Topic=4 -> "Maybe another time."
}

View File

@ -3,10 +3,10 @@
Name = "Raymond Striker"
Outfit = (151,58-77-60-114-1)
Home = [32350,32588,7]
Radius = 4
Radius = 2
Behaviour = {
ADDRESS,"hello$",! -> "Be greeted."
ADDRESS,"hello$",! -> "Be greeted. Is there anything I can do for you?"
ADDRESS,"hi$",! -> *
ADDRESS,! -> Idle
BUSY,"hello$",! -> "Wait a minute, %N.", Queue
@ -14,6 +14,67 @@ BUSY,"hi$",! -> *
BUSY,! -> NOP
VANISH,! -> "Good bye."
"bye" -> "Good bye, %N!", Idle
"bye" -> "May there always be wind in your sails, %N.", Idle
"farewell" -> *
"name" -> "Raymond Striker, at your service."
"job" -> "I am one of the free captains of the Shattered Isles, who selected me as their spokesperson."
"captains" -> "We don't consider ourselves as pirates, but as freedom fighters. But there are indeed pirates out there. They are true bandits, cutthroats and murderers. They are the ones responsible for the horrible acts that are accredited to us."
"ferumbras" -> "It is rumoured that he has established some base on one of the isles in the past."
"Liberty","Bay" -> "One day the city will bear this name justly and with pride."
"Thais" -> "Thais is not the source of the evil that has befallen our isles. It might end up as a victim itself whenever Venore feels powerful enough."
"Venore" -> "The scheming trade barons of Venore know nothing but profit and power. For that, they lie and murder and would readily sell their souls."
"Carlin" -> "We have loose trade relations with Carlin."
"Eleonore",QuestValue(17502)>12 -> "She is my only and true love. It hurts me deeply that the mermaid's magic let me forget her. I feel so guilty and can only hope that Eleonore can forgive my weakness."
"King" -> "I doubt the king gains as much from the occupation of the isles as the Venoreans do."
#shattered
"mission",QuestValue(17502)=6 -> "Don't ask about silly missions. All I can think about is this lovely mermaid.", Topic=1
"Eleonore",QuestValue(17502)=6 -> "Eleonore ... Yes, I remember her... vaguely. She is a pretty girl ... but still only a girl and now I am in love with a beautiful and passionate woman. A true mermaid even.", Topic=1
Topic=1,"mermaid" -> "The mermaid is the most beautiful creature I have ever met. She is so wonderful. It was some kind of magic as we first met. A look in her eyes and I suddenly knew there would be never again another woman in my life but her.", SetQuestValue(17502,7)
"mermaid",QuestValue(17502)>6,QuestValue(17502)<12 -> "The mermaid is the most beautiful creature I have ever met. She is so wonderful. It was some kind of magic as we first met. A look in her eyes and I suddenly knew there would be never again another woman in my life but her."
"mermaid",QuestValue(17502)>12 -> "I am deeply ashamed that I lacked the willpower to resist her spell. Thank you for your help in that matter. Now my head is once more free to think about our mission."
"marina",QuestValue(17502)>12 -> *
# Meriana_Quest
"mission",QuestValue(17502)>12,QuestValue(17520)=0 -> "Ask around in the settlement where you can help out. If you have proven your worth I might have some missions for you.", SetQuestValue(17520,1)
"mission",QuestValue(17520)=1,QuestValue(17521)=4,QuestValue(17522)=3,QuestValue(17523)=2,QuestValue(17524)=6 -> "Indeed, I could use some help. The evil pirates of Nargor have convinced an alchemist from Edron to supply them with a substance called Fafnar's Fire ...",
"It can burn even on water and is a threat to us all. I need you to travel to Edron and pretend to the alchemist Sandra that you are the one whom the other pirates sent to get the fire ...",
"When she asks for a payment, tell her 'Your continued existence is payment enough'. That should enrage any member of the Edron academy enough to refuse any further deals with the pirates.", SetQuestValue(17520,2)
"mission",QuestValue(17520)=1 -> "Ask around in the settlement where you can help out. If you have proven your worth I might have some missions for you."
"mission",QuestValue(17520)=2 -> "I am still waiting news from you about Fafnar's Fire from alchemist Sandra."
"mission",QuestValue(17520)=3 -> "I think that means 'mission accomplished'. Hehe. I guess that will put an end to their efforts to buy any alchemical substance from Edron.", SetQuestValue(17520,4)
"mission",QuestValue(17520)=4 -> "The mission on which I will send you is vital to our cause. It is a sabotage mission. Nargor is guarded by several heavy catapults. ...",
"I need you to sabotage the most dangerous of those catapults which can be found right in their harbour, aiming at ships passing by the entrance. ...",
"Get a fire bug - you can buy them in Liberty Bay - and set this catapult on fire. ...",
"Make sure to use the bug on the left part of the catapult where its lever is. That is where it's most vulnerable. ...",
"If you see a short explosion, you will know that it worked. I will tell Sebastian to bring you to Nargor, but beware. ...",
"Of course, he can't drop you off directly in the pirate's base. However, we have discovered a secret way into the Howling Grotto. ...",
"Try to make your way through the caves of Nargor to reach their harbour. This is where you will find the catapult in question.", SetQuestValue(17520,5)
"mission",QuestValue(17520)=5 -> "Sail with Sebastian to Nargor and make your way to the pirate's harbour. Once arrived there, find the catapult and use a fire bug on the left part. ...",
"A small explosion will show you that you have succeeded. Afterwards, report to me about your mission. Good luck!"
"mission",QuestValue(17520)=6 -> "You did it! Excellent!", SetQuestValue(17520,7)
"mission",QuestValue(17520)=7,QuestValue(17525)<2 -> "I have heard that Duncan has a mission for you this time."
"mission",QuestValue(17520)=7 -> "If you manage to accomplish this vital mission you will prove yourself to be a worthy member of our community. I might even grant you your own ship and pirate clothing! ...",
"So listen to the first step of my plan. I want you to infiltrate their base. Try to enter their tavern, which means that you have to get past the guard. ...",
"You will probably have to deceive him somehow, so that he thinks you are one of them. ...",
"In the tavern, the pirates feel safe and plan their next strikes. Study ALL of their maps and plans lying around ...",
"Afterwards, return here and report to me about your mission.", SetQuestValue(17520,8)
"mission",QuestValue(17520)=8,QuestValue(17528)=1,QuestValue(17529)=1,QuestValue(17530)=1 -> "Well done, my friend. That will help us a lot. Of course there are other things to be done though. ...",
"I learned that Klaus, the owner of the tavern, wants me dead. He is offering any of those pirates a mission to kill me....",
"If we could convince him that you fulfilled that mission, the pirates will have the party of their lives. This would be our chance for a sneak attack to damage their boats and steal their plunder! ...",
"Obtain this mission from him and learn what he needs as a proof. Then return to me and report to me about your mission so we can formulate an appropriate plan.", SetQuestValue(17520,9)
"mission",QuestValue(17520)=8 -> "I am waiting for the information about the pirate plans my friend."
"mission",QuestValue(17520)=9 -> "Still planning to go to Klaus right?"
"mission",QuestValue(17520)=9,QuestValue(17531)=1 -> Type=6105, Amount=1, "My pillow?? They know me all too well... <sigh> I've owned it since my childhood. However. Here, take it and convince him that I am dead.", Create(Type), SetQuestValue(17520,10)
"mission",QuestValue(17520)=10 -> "Pillow is already yours. Just go to Klaus and convince him that I am dead."
"mission",QuestValue(17520)=10,QuestValue(17531)=2 -> Type=2994, Amount=1, "Incredible! You did what no other did even dare to think about! You are indeed a true hero to our cause ...",
"Sadly I have no ship that lacks a captain, else you would of course be our first choice. I am still true to my word as best as I am able. ...",
"So take this as your very own ship. Oh, and remind me about the pirate outfit sometime.", Create(Type), SetQuestValue(17520,11)
"mission" -> "Sorry, I don't have any missions for you."
"outfit",QuestValue(17520)=11 -> "Ah, right! The pirate outfit! Here you go, now you are truly one of us.", AddOutfit(155), AddOutfit(151), SetQuestValue(17520,12)
}

View File

@ -59,4 +59,11 @@ Topic=2 -> "Hmm, but next time."
Topic=3,"yes",Count(2874)>0 -> Amount=Count(2874), Price=Amount*5, "Here you are ... %P gold.", Delete(2874), CreateMoney
Topic=3,"yes" -> "You don't have any empty vials."
Topic=3 -> "Hmm, but please keep Tibia litter free."
"mission",QuestValue(17520)=2 -> "Pssht, not that loud. So they have sent you to get... the stuff?", Topic=4
"fafnar","fire",QuestValue(17520)=2 -> *
Topic=4,"yes" -> "Finally. You have no idea how difficult it is to keep something secret here. And you brought me all the crystal coins I demanded?", Topic=5
Topic=4 -> "How do you even know about the stuff then..."
Topic=5,"Your","continued","existence","is","payment","enough" -> "What?? How dare you?! I am a sorcerer of the most reknown academy on the face of this world. Do you think some lousy pirates could scare me? Get lost! Now! I will have no further dealings with the likes of you!", SetQuestValue(17520,3)
Topic=5 -> "I see no deal with you then."
}

View File

@ -23,6 +23,7 @@ VANISH,! -> "Hm."
"meriana" -> "Yes. We are in Meriana."
"liberty bay" -> Price=50, "Do you seek a passage to Liberty Bay for %P?", Topic=1
"nargor",QuestValue(17520)<4 -> "Sorry, but you have to get permission from the Raymond Striker if you wan't to sail to Nargor."
"nargor" -> Price=50, "Do you seek a passage to Nargor for %P?", Topic=2
Topic=1,"yes",PZBlock,! -> "First get rid of those blood stains! You are not going to ruin my vehicle!"

View File

@ -17,7 +17,6 @@ VANISH,! -> "Get lost."
"bye" -> "Get lost.", Idle
"farewell" -> *
"what" -> "I guard this door. I won't let anyone pass who is not supposed to enter."
"enter" -> "YOU WILL NOT PASS! Erm ... I mean you don't look like a true pirate to me. You won't get in."
"pirate" -> "Yoho, a pirate's life for me!"
"name" -> "They call me Vulturenose."
"rum" -> "You won't bribe old Vulturenose with some rum. No way."
@ -31,4 +30,7 @@ VANISH,! -> "Get lost."
"thais" -> "Thais is a town full of wimps."
"carlin" -> "A city full of women? That calls for plunder. Sadly, a bit far away. Ho Ho Ho."
"enter",QuestValue(17527)=1 -> "Hey, I rarely see a dashing pirate like you! Get in, matey!"
"enter",QuestValue(17527)=0,SlotItem(1)=6096,SlotItem(4)=6095,SlotItem(7)=5918,SlotItem(8)=5461 -> "Hey, I rarely see a dashing pirate like you! Get in, matey!", SetQuestValue(17527,1)
"enter",QuestValue(17527)=0 -> "YOU WILL NOT PASS! Erm ... I mean you don't look like a true pirate to me. You won't get in."
}

View File

@ -22,7 +22,6 @@ VANISH,! -> "Use your knowledge wisely."
"king" -> "King Tibianus III was the founder of our academy."
"tibianus" -> *
"army" -> "They rely too much on their brawn instead of their brain."
"ferumbras" -> "A fallen sorcerer, indeed. What a shame."
"excalibug" -> "You will need no weapon if you manipulate the essence of magic."
"thais" -> "Thais is a place of barbary."
"tibia" -> "There is still much left to be explored in this world."
@ -59,4 +58,28 @@ Topic=1,"yes",Level<SpellLevel(String) -> Amount=SpellLevel(String), "Don't be i
Topic=1,"yes",CountMoney<Price -> "Want to learn one of the most powerful spells, and don't even know how much money you have?"
Topic=1,"yes" -> "Congratulations. You now know one of the most powerful spells. Use it wisely.", DeleteMoney, EffectOpp(13), TeachSpell(String)
Topic=1 -> "Lost your heart?"
"ferumbras", QuestValue(17513)>0 -> "I see, you managed to reach Kharos, the harbinger isle, and discovered the gates to Ferumbras' citadel, and now you are here full of questions. Are you ready to listen?", Topic=3
Topic=3,"yes" -> "So know that destroying the mortal shell of the being called Ferumbras was the best we were able to achieve with our combined efforts in the past. ...",
"He was destroyed not only once but several times. Eventually we were able to figure out the secret of his seeming immortality. ...",
"On one of the most remote islands of the Shattered Isles, he built a citadel with demonic aid right around a powerful magical nexus. ...",
"The only reason for the whole complex was to establish a point of return into our world. Whenever he is slain, his soul retreats to some demonic dimension to regain enough strength to re-enter the world. ...",
"We were not able to destroy his citadel, this unholy construct. To make matters worse, the nexus makes it easy for demons of all kind to pass into our world. ...",
"The best thing we could do was to seal the citadel and to install a device that will alarm us whenever Ferumbras tries to re-enter our world. ...",
"We grant heroes like you the permission to pass our seals and enter Ferumbras' citadel. ...",
"Just ask for the permission if you are ready to go there. Be warned that the citadel is no holiday place though. You will encounter large amounts of demons and traps that scare off most adventurers. ...",
"On the other hand, WHEN Ferumbras re-enters the world we need heroes like you to face him on his very own ground before he can escape. ...",
"His return is not very likely but it can happen each and every day. If you should manage to defeat him, bring a proof of his death here and you will be rewarded."
Topic=3 -> "Lost your heart?"
"ferumbras", QuestValue(17513)=0 -> "A fallen sorcerer, indeed. What a shame."
"permission",QuestValue(17513)=0 -> "I see no reason to discuss this matter with you."
"permission",QuestValue(17513)=1 -> Price=500, "The attuning to our seals is a costly process and it will grant you access to the citadel ONLY ONCE. Each time you want to enter, you will need a new attuning. Are you willing to pay 500 gold pieces to become attuned to the seal of the citadel?", Topic=2
Topic=2,"yes",CountMoney>=Price -> "SO BE IT!", DeleteMoney, SetQuestValue(17513,2), EffectOpp(15)
Topic=2,"yes" -> "Don't even know how much money you have?"
Topic=2 -> "Lost your heart?"
"permission",QuestValue(17513)=2 -> "You already have the permission to enter the citadel."
}

Binary file not shown.

View File

@ -852,6 +852,18 @@
<monster name="hydra" x="0" y="0" z="4" spawntime="600" />
<monster name="hydra" x="0" y="2" z="4" spawntime="600" />
</spawn>
<spawn centerx="32119" centery="32681" centerz="4" radius="1">
<monster name="magic pillar" x="0" y="0" z="4" spawntime="60" />
</spawn>
<spawn centerx="32124" centery="32681" centerz="4" radius="1">
<monster name="magic pillar" x="0" y="0" z="4" spawntime="60" />
</spawn>
<spawn centerx="32115" centery="32685" centerz="4" radius="1">
<monster name="magic pillar" x="0" y="0" z="4" spawntime="60" />
</spawn>
<spawn centerx="32128" centery="32685" centerz="4" radius="1">
<monster name="magic pillar" x="0" y="0" z="4" spawntime="60" />
</spawn>
<spawn centerx="32121" centery="32687" centerz="4" radius="4">
<monster name="demon" x="-4" y="-4" z="4" spawntime="59" />
<monster name="demon" x="4" y="-4" z="4" spawntime="59" />
@ -863,6 +875,12 @@
<monster name="dragon lord" x="-2" y="0" z="4" spawntime="1200" />
<monster name="dragon lord" x="0" y="0" z="4" spawntime="1200" />
</spawn>
<spawn centerx="32118" centery="32693" centerz="4" radius="1">
<monster name="magic pillar" x="0" y="0" z="4" spawntime="60" />
</spawn>
<spawn centerx="32125" centery="32693" centerz="4" radius="1">
<monster name="magic pillar" x="0" y="0" z="4" spawntime="60" />
</spawn>
<spawn centerx="33041" centery="32708" centerz="4" radius="1">
<monster name="dragon" x="0" y="0" z="4" spawntime="900" />
</spawn>

View File

@ -336,6 +336,9 @@ bool BehaviourDatabase::loadActions(ScriptReader& script, NpcBehaviour* behaviou
} else if (identifier == "addoutfitaddon") {
action->type = BEHAVIOUR_TYPE_ADDOUTFITADDON;
searchType = BEHAVIOUR_PARAMETER_TWO;
} else if (identifier == "addoutfit") {
action->type = BEHAVIOUR_TYPE_ADDOUTFIT;
searchType = BEHAVIOUR_PARAMETER_ONE;
} else if (identifier == "poison") {
action->type = BEHAVIOUR_TYPE_POISON;
searchType = BEHAVIOUR_PARAMETER_TWO;
@ -544,6 +547,10 @@ NpcBehaviourNode* BehaviourDatabase::readValue(ScriptReader& script)
node = new NpcBehaviourNode();
node->type = BEHAVIOUR_TYPE_RANDOM;
searchType = BEHAVIOUR_PARAMETER_TWO;
} else if (identifier == "slotitem") {
node = new NpcBehaviourNode();
node->type = BEHAVIOUR_TYPE_SLOTITEM;
searchType = BEHAVIOUR_PARAMETER_ONE;
}
if (searchType == BEHAVIOUR_PARAMETER_ONE) {
@ -942,6 +949,12 @@ void BehaviourDatabase::checkAction(const NpcBehaviourAction* action, Player* pl
player->addOutfit(lookType, addon);
break;
}
case BEHAVIOUR_TYPE_ADDOUTFIT: {
int32_t lookType = evaluate(action->expression, player, message);
player->addOutfit(lookType, 0);
break;
}
case BEHAVIOUR_TYPE_TELEPORT: {
Position pos;
pos.x = evaluate(action->expression, player, message);
@ -1110,6 +1123,21 @@ int32_t BehaviourDatabase::evaluate(NpcBehaviourNode* node, Player* player, cons
player->getStorageValue(questNumber, questValue);
return questValue;
}
case BEHAVIOUR_TYPE_SLOTITEM: {
int32_t slot = evaluate(node->left, player, message);
Thing* thing = player->getThing(slot);
if (!thing) {
return 0;
}
Item* item = thing->getItem();
if (!item) {
return 0;
}
return item->getID();
}
case BEHAVIOUR_TYPE_EXPIRINGQUESTVALUE: {
int32_t questNumber = evaluate(node->left, player, message);
int32_t questValue;

View File

@ -87,8 +87,10 @@ enum NpcBehaviourType_t
BEHAVIOUR_TYPE_TOWN, // change player town
BEHAVIOUR_TYPE_DRUNK, // get/set drunk (set not done)
BEHAVIOUR_TYPE_ADDOUTFITADDON, // Add Outfit Addon
BEHAVIOUR_TYPE_ADDOUTFIT, // Add Outfit
BEHAVIOUR_TYPE_DELETEAMOUNT, // deletes an item according specified amount
BEHAVIOUR_TYPE_EXPIRINGQUESTVALUE, // get/set expiring quest value
BEHAVIOUR_TYPE_SLOTITEM, // get slot item
};
enum NpcBehaviourOperator_t

View File

@ -162,6 +162,13 @@ class Creature : virtual public Thing
direction = dir;
}
bool isHealthHidden() const {
return hiddenHealth;
}
void setHiddenHealth(bool b) {
hiddenHealth = b;
}
int32_t getThrowRange() const final {
return 1;
}
@ -511,6 +518,7 @@ class Creature : virtual public Thing
bool cancelNextWalk = false;
bool hasFollowPath = false;
bool forceUpdateFollowPath = false;
bool hiddenHealth = false;
//creature script events
bool hasEventRegistered(CreatureEventType_t event) const {

View File

@ -1922,6 +1922,7 @@ void LuaScriptInterface::registerFunctions()
registerMethod("Creature", "addHealth", LuaScriptInterface::luaCreatureAddHealth);
registerMethod("Creature", "getMaxHealth", LuaScriptInterface::luaCreatureGetMaxHealth);
registerMethod("Creature", "setMaxHealth", LuaScriptInterface::luaCreatureSetMaxHealth);
registerMethod("Creature", "setHiddenHealth", LuaScriptInterface::luaCreatureSetHiddenHealth);
registerMethod("Creature", "getSkull", LuaScriptInterface::luaCreatureGetSkull);
registerMethod("Creature", "setSkull", LuaScriptInterface::luaCreatureSetSkull);
@ -2311,6 +2312,7 @@ void LuaScriptInterface::registerFunctions()
registerMethod("MonsterType", "isIllusionable", LuaScriptInterface::luaMonsterTypeIsIllusionable);
registerMethod("MonsterType", "isHostile", LuaScriptInterface::luaMonsterTypeIsHostile);
registerMethod("MonsterType", "isPushable", LuaScriptInterface::luaMonsterTypeIsPushable);
registerMethod("MonsterType", "isHealthShown", LuaScriptInterface::luaMonsterTypeIsHealthShown);
registerMethod("MonsterType", "canPushItems", LuaScriptInterface::luaMonsterTypeCanPushItems);
registerMethod("MonsterType", "canPushCreatures", LuaScriptInterface::luaMonsterTypeCanPushCreatures);
@ -6677,6 +6679,21 @@ int LuaScriptInterface::luaCreatureSetMaxHealth(lua_State* L)
return 1;
}
int LuaScriptInterface::luaCreatureSetHiddenHealth(lua_State* L)
{
// creature:setHiddenHealth(hide)
Creature* creature = getUserdata<Creature>(L, 1);
if (creature) {
creature->setHiddenHealth(getBoolean(L, 2));
g_game.addCreatureHealth(creature);
pushBoolean(L, true);
}
else {
lua_pushnil(L);
}
return 1;
}
int LuaScriptInterface::luaCreatureGetSkull(lua_State* L)
{
// creature:getSkull()
@ -10880,6 +10897,19 @@ int LuaScriptInterface::luaMonsterTypeIsPushable(lua_State* L)
return 1;
}
int LuaScriptInterface::luaMonsterTypeIsHealthShown(lua_State* L)
{
// monsterType:isHealthShown()
MonsterType* monsterType = getUserdata<MonsterType>(L, 1);
if (monsterType) {
pushBoolean(L, !monsterType->info.hiddenHealth);
}
else {
lua_pushnil(L);
}
return 1;
}
int LuaScriptInterface::luaMonsterTypeCanPushItems(lua_State* L)
{
// monsterType:canPushItems()

View File

@ -752,6 +752,7 @@ class LuaScriptInterface
static int luaCreatureAddHealth(lua_State* L);
static int luaCreatureGetMaxHealth(lua_State* L);
static int luaCreatureSetMaxHealth(lua_State* L);
static int luaCreatureSetHiddenHealth(lua_State* L);
static int luaCreatureGetSkull(lua_State* L);
static int luaCreatureSetSkull(lua_State* L);
@ -1128,6 +1129,7 @@ class LuaScriptInterface
static int luaMonsterTypeIsIllusionable(lua_State* L);
static int luaMonsterTypeIsHostile(lua_State* L);
static int luaMonsterTypeIsPushable(lua_State* L);
static int luaMonsterTypeIsHealthShown(lua_State* L);
static int luaMonsterTypeCanPushItems(lua_State* L);
static int luaMonsterTypeCanPushCreatures(lua_State* L);

View File

@ -54,6 +54,7 @@ Monster::Monster(MonsterType* mtype) :
healthMax = mType->info.healthMax;
baseSpeed = mType->info.baseSpeed;
internalLight = mType->info.light;
hiddenHealth = mType->info.hiddenHealth;
// register creature events
for (const std::string& scriptName : mType->info.scripts) {

View File

@ -690,6 +690,8 @@ bool Monsters::loadMonster(const std::string& file, const std::string& monsterNa
mType->info.targetDistance = std::max<int32_t>(1, pugi::cast<int32_t>(attr.value()));
} else if (strcasecmp(attrName, "runonhealth") == 0) {
mType->info.runAwayHealth = pugi::cast<int32_t>(attr.value());
} else if (strcasecmp(attrName, "hidehealth") == 0) {
mType->info.hiddenHealth = attr.as_bool();
} else {
std::cout << "[Warning - Monsters::loadMonster] Unknown flag attribute: " << attrName << ". " << file << std::endl;
}

View File

@ -1434,7 +1434,14 @@ void ProtocolGame::sendCreatureHealth(const Creature* creature)
NetworkMessage msg;
msg.addByte(0x8C);
msg.add<uint32_t>(creature->getID());
if (creature->isHealthHidden()) {
msg.addByte(0x00);
}
else {
msg.addByte(std::ceil((static_cast<double>(creature->getHealth()) / std::max<int32_t>(creature->getMaxHealth(), 1)) * 100));
}
writeToOutputBuffer(msg);
}
@ -1848,7 +1855,13 @@ void ProtocolGame::AddCreature(NetworkMessage& msg, const Creature* creature, bo
msg.addString(creature->getName());
}
if (creature->isHealthHidden()) {
msg.addByte(0x00);
}
else {
msg.addByte(std::ceil((static_cast<double>(creature->getHealth()) / std::max<int32_t>(creature->getMaxHealth(), 1)) * 100));
}
msg.addByte(creature->getDirection());
if (!creature->isInGhostMode() && !creature->isInvisible()) {