Merge branch '35-balance-paladins-knights-and-druids' into 'master'

Resolve "Balance Paladins, Knights and Druids"

Closes #35

See merge request ErikasKontenis/Sabrehaven!32
This commit is contained in:
Erikas Kontenis 2021-02-25 15:46:44 +00:00
commit 3bd1a6f07e
168 changed files with 2312 additions and 588 deletions

View File

@ -1 +1 @@
next: 17723
next: 17739

View File

@ -1,6 +1,10 @@
-- Custom
knightCloseAttackDamageIncreasePercent = 50
paladinRangeAttackDamageIncreasePercent = 40
clientVersion = 792
knightCloseAttackDamageIncreasePercent = 20
paladinRangeAttackDamageIncreasePercent = 15
-- Min/Max rate spawn is a multiplication of the map spawntime in spawns.xml Regular monster spawn time is 600. The formula would be randomValue = random(600*100, 600*200) which varies between 60s and 120s
minRateSpawn = 100
maxRateSpawn = 200
-- Combat settings
-- NOTE: valid values for worldType are: "pvp", "no-pvp" and "pvp-enforced"
@ -15,15 +19,15 @@ expFromPlayersLevelRange = 75
distanceWeaponsDropOnGround = false
-- Skull System
banLength = 30 * 24 * 60 * 60
banLength = 2 * 24 * 60 * 60
whiteSkullTime = 15 * 60
redSkullTime = 30 * 24 * 60 * 60
redSkullTime = 7 * 24 * 60 * 60
killsDayRedSkull = 3
killsWeekRedSkull = 5
killsMonthRedSkull = 10
killsDayBanishment = 6
killsWeekBanishment = 10
killsMonthBanishment = 20
killsWeekRedSkull = 6
killsMonthRedSkull = 99999
killsDayBanishment = 1
killsWeekBanishment = 12
killsMonthBanishment = 99999
-- Connection Config
-- NOTE: maxPlayers set to 0 means no limit
@ -32,7 +36,7 @@ bindOnlyGlobalAddress = false
loginProtocolPort = 7171
gameProtocolPort = 7172
statusProtocolPort = 7171
maxPlayers = 1000
maxPlayers = 0
motd = "Welcome to Sabrehaven!"
onePlayerOnlinePerAccount = true
allowClones = false
@ -42,7 +46,6 @@ replaceKickOnLogin = true
maxPacketsPerSecond = -1
autoStackCumulatives = false
moneyRate = 1
clientVersion = 792
-- Deaths
-- NOTE: Leave deathLosePercent as -1 if you want to use the default
@ -89,7 +92,7 @@ newbieLevelThreshold = 5
-- Rates
-- NOTE: rateExp is not used if you have enabled stages in data/XML/stages.xml
rateExp = 1
rateSkill = 5
rateSkill = 3
rateLoot = 2
rateMagic = 2
rateSpawn = 0
@ -109,7 +112,7 @@ defaultPriority = "high"
startupDatabaseOptimization = true
-- Status server information
ownerName = ""
ownerName = "Erikas"
ownerEmail = ""
url = "https://otland.net/"
location = "Sweden"
url = "https://sabrehaven.com/"
location = "Poland"

View File

@ -446,6 +446,26 @@
<mission name="Paw and Fur: Dwarfs" storageid="17703" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Low Undeads" storageid="17704" startvalue="0" endvalue="100" description="You already hunted |STATE|/100 undeads." />
<mission name="Paw and Fur: Low Undeads" storageid="17704" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Elves" storageid="17729" startvalue="0" endvalue="200" description="You already hunted |STATE|/200 elves." />
<mission name="Paw and Fur: Elves" storageid="17729" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Bugs" storageid="17730" startvalue="0" endvalue="40" description="You already hunted |STATE|/40 bugs." />
<mission name="Paw and Fur: Bugs" storageid="17730" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Outlaws" storageid="17731" startvalue="0" endvalue="250" description="You already hunted |STATE|/250 outlaws." />
<mission name="Paw and Fur: Outlaws" storageid="17731" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Hyaenas" storageid="17732" startvalue="0" endvalue="30" description="You already hunted |STATE|/30 hyaenas." />
<mission name="Paw and Fur: Hyaenas" storageid="17732" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Lions" storageid="17733" startvalue="0" endvalue="20" description="You already hunted |STATE|/20 lions." />
<mission name="Paw and Fur: Lions" storageid="17733" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Bears" storageid="17734" startvalue="0" endvalue="35" description="You already hunted |STATE|/35 bears." />
<mission name="Paw and Fur: Bears" storageid="17734" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Slimes" storageid="17735" startvalue="0" endvalue="100" description="You already hunted |STATE|/100 slimes." />
<mission name="Paw and Fur: Slimes" storageid="17735" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Beholders" storageid="17736" startvalue="0" endvalue="250" description="You already hunted |STATE|/250 beholders." />
<mission name="Paw and Fur: Beholders" storageid="17736" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Djinns" storageid="17737" startvalue="0" endvalue="500" description="You already hunted |STATE|/500 djinns." />
<mission name="Paw and Fur: Djinns" storageid="17737" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Pirates" storageid="17738" startvalue="0" endvalue="600" description="You already hunted |STATE|/600 pirates." />
<mission name="Paw and Fur: Pirates" storageid="17738" startvalue="99999" endvalue="99999" description="You have finished the task." />
<!--Grizzly Adams: level 50 to 79 -->
<mission name="Paw and Fur: Quara Scouts" storageid="17616" startvalue="0" endvalue="200" description="You already hunted |STATE|/200 quara scouts." />
@ -459,17 +479,27 @@
<mission name="Paw and Fur: Dragons" storageid="17620" startvalue="0" endvalue="200" description="You already hunted |STATE|/200 dragons." />
<mission name="Paw and Fur: Dragons" storageid="17620" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Medium Class Orcs" storageid="17712" startvalue="0" endvalue="300" description="You already hunted |STATE|/300 orcs." />
<mission name="Paw and Fur: Medium Class Orcs" storageid="17712" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: High Class Minotaurs" storageid="17713" startvalue="0" endvalue="300" description="You already hunted |STATE|/300 minotaurs." />
<mission name="Paw and Fur: High Class Minotaurs" storageid="17713" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Lizards" storageid="17714" startvalue="0" endvalue="300" description="You already hunted |STATE|/300 lizards." />
<mission name="Paw and Fur: Lizards" storageid="17714" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: High Class Dwarfs" storageid="17715" startvalue="0" endvalue="300" description="You already hunted |STATE|/300 dwarfs." />
<mission name="Paw and Fur: High Class Dwarfs" storageid="17715" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Medium Undeads" storageid="17716" startvalue="0" endvalue="200" description="You already hunted |STATE|/200 undeads." />
<mission name="Paw and Fur: Medium Undeads" storageid="17716" startvalue="99999" endvalue="99999" description="You have finished the task." />
<!--Grizzly Adams: level 80 to 129 -->
<mission name="Paw and Fur: Quara" storageid="17621" startvalue="0" endvalue="600" description="You already hunted |STATE|/600 quara." />
<mission name="Paw and Fur: Quara" storageid="17621" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Giant Spiders" storageid="17622" startvalue="0" endvalue="500" description="You already hunted |STATE|/500 giant spiders." />
<mission name="Paw and Fur: Giant Spiders" storageid="17622" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Banshees" storageid="17623" startvalue="0" endvalue="300" description="You already hunted |STATE|/300 banshees." />
<mission name="Paw and Fur: Banshees" storageid="17623" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Lichs" storageid="17624" startvalue="0" endvalue="500" description="You already hunted |STATE|/500 lichs." />
<mission name="Paw and Fur: Lichs" storageid="17624" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Cults" storageid="17625" startvalue="0" endvalue="500" description="You already hunted |STATE|/500 cults." />
<mission name="Paw and Fur: Cults" storageid="17625" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: High Class Orcs" storageid="17717" startvalue="0" endvalue="125" description="You already hunted |STATE|/125 orcs." />
<mission name="Paw and Fur: High Class Orcs" storageid="17717" startvalue="99999" endvalue="99999" description="You have finished the task." />
<mission name="Paw and Fur: Heros" storageid="17718" startvalue="0" endvalue="150" description="You already hunted |STATE|/150 heros." />

View File

@ -1,10 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<stages>
<config enabled="1"/>
<stage minlevel="1" maxlevel="20" multiplier="15" />
<stage minlevel="21" maxlevel="40" multiplier="12" />
<stage minlevel="41" maxlevel="60" multiplier="10" />
<stage minlevel="61" maxlevel="80" multiplier="6" />
<stage minlevel="81" maxlevel="100" multiplier="3" />
<stage minlevel="101" multiplier="2" />
<stage minlevel="1" maxlevel="10" multiplier="10" />
<stage minlevel="11" maxlevel="20" multiplier="9" />
<stage minlevel="21" maxlevel="30" multiplier="8" />
<stage minlevel="31" maxlevel="40" multiplier="7" />
<stage minlevel="41" maxlevel="50" multiplier="6" />
<stage minlevel="51" maxlevel="60" multiplier="5" />
<stage minlevel="61" maxlevel="70" multiplier="4" />
<stage minlevel="71" maxlevel="80" multiplier="3" />
<stage minlevel="81" multiplier="2" />
</stages>

View File

@ -239,6 +239,8 @@
<action itemid="3031" script="misc/changegold.lua" />
<action itemid="3035" script="misc/changegold.lua" />
<action itemid="3043" script="misc/changegold.lua" />
<action fromaid="17724" toaid="17728" script="misc/skill_trainer.lua" />
<action fromid="6506" toid="6508" script="misc/christmas_bundle.lua" />
<!-- Chests -->
<action itemid="2479" script="misc/chests.lua" />

View File

@ -0,0 +1,50 @@
function onUse(player, item, fromPosition, target, toPosition, isHotkey)
local bundleTypes = {
[6506] = { -- red christmas bundle
6503
},
[6507] = { -- blue christmas bundle
6504
},
[6508] = { -- green christmas bundle
6502
}
}
local common = {
{6569, 15}, {3598, 20}, {3599, 10}, {3586, 10}, {3585, 5}, 6500, 6501, 6489, 6387
}
local targetItem = bundleTypes[item.itemid]
if not targetItem then
return true
end
targetItem = common
-- In case there's going to be more than one unique item per bundle
for i = 1, #bundleTypes[item.itemid] do
table.insert(targetItem, bundleTypes[item.itemid][i])
end
local rewards = {}
repeat
local count = 1
local rand = math.random(#targetItem)
local gift = targetItem[rand]
if type(gift) == "table" then
count = gift[2]
gift = gift[1]
end
rewards[#rewards + 1] = {gift, count}
table.remove(targetItem, rand)
until #rewards == 7
for i = 1, #rewards do
player:addItem(rewards[i][1], rewards[i][2])
end
item:remove(1)
fromPosition:sendMagicEffect(CONST_ME_GIFT_WRAPS)
return true
end

View File

@ -0,0 +1,30 @@
local statues = {
[17725] = SKILL_SWORD,
[17724] = SKILL_AXE,
[17726] = SKILL_CLUB,
[17727] = SKILL_DISTANCE,
[17728] = SKILL_MAGLEVEL
}
function onUse(player, item, fromPosition, target, toPosition, isHotkey)
local skill = statues[item:getActionId()]
if not player:isPremium() then
player:sendCancelMessage(RETURNVALUE_YOUNEEDPREMIUMACCOUNT)
return true
end
if player:isPzLocked() then
return false
end
local entreePrice = 1000
if player:getBankBalance() < entreePrice then
player:sendCancelMessage("You do not have 1000 gold coins in your bank account balance to participate in offline training.")
return true
end
player:setOfflineTrainingSkill(skill)
player:setBankBalance(player:getBankBalance() - entreePrice)
player:remove()
return true
end

View File

@ -6,7 +6,8 @@
<event type="login" name="FirstItems" script="firstitems.lua"/>
<event type="login" name="RegenerateStamina" script="regeneratestamina.lua" />
<event type="death" name="PlayerDeath" script="playerdeath.lua"/>
<event type="login" name="OfflineTraining" script="offlinetraining.lua" />
<!-- Killing In The Name Of Quest -->
<event type="kill" name="KillingInTheNameOfKills" script="killing_in_the_name_of.lua" />
<event type="death" name="KillingInTheNameOf" script="killing_in_the_name_of.lua" />
</creaturescripts>

View File

@ -40,11 +40,35 @@ local tasks = {
['rat'] = {taskerStorage = 17608, progressStorage = 17699, killsRequired = 25},
['cave rat'] = {taskerStorage = 17608, progressStorage = 17699, killsRequired = 25},
['wolf'] = {taskerStorage = 17608, progressStorage = 17700, killsRequired = 100},
['winter wolf'] = {taskerStorage = 17608, progressStorage = 17700, killsRequired = 100},
['wasp'] = {taskerStorage = 17608, progressStorage = 17701, killsRequired = 100},
['larva'] = {taskerStorage = 17608, progressStorage = 17702, killsRequired = 100},
['dwarf'] = {taskerStorage = 17608, progressStorage = 17703, killsRequired = 100},
['skeleton'] = {taskerStorage = 17608, progressStorage = 17704, killsRequired = 100},
['ghoul'] = {taskerStorage = 17608, progressStorage = 17704, killsRequired = 100},
['elf'] = {taskerStorage = 17608, progressStorage = 17729, killsRequired = 200},
['elf scout'] = {taskerStorage = 17608, progressStorage = 17729, killsRequired = 200},
['elf arcanist'] = {taskerStorage = 17608, progressStorage = 17729, killsRequired = 200},
['bug'] = {taskerStorage = 17608, progressStorage = 17730, killsRequired = 40},
['smuggler'] = {taskerStorage = 17608, progressStorage = 17731, killsRequired = 250},
['wild warrior'] = {taskerStorage = 17608, progressStorage = 17731, killsRequired = 250},
['bandit'] = {taskerStorage = 17608, progressStorage = 17731, killsRequired = 250},
['hyaena'] = {taskerStorage = 17608, progressStorage = 17732, killsRequired = 30},
['lion'] = {taskerStorage = 17608, progressStorage = 17733, killsRequired = 20},
['bear'] = {taskerStorage = 17608, progressStorage = 17734, killsRequired = 35},
['slime'] = {taskerStorage = 17608, progressStorage = 17735, killsRequired = 100},
['beholder'] = {taskerStorage = 17608, progressStorage = 17736, killsRequired = 250},
['elder beholder'] = {taskerStorage = 17608, progressStorage = 17736, killsRequired = 250},
['green djinn'] = {taskerStorage = 17608, progressStorage = 17737, killsRequired = 500},
['blue djinn'] = {taskerStorage = 17608, progressStorage = 17737, killsRequired = 500},
['marid'] = {taskerStorage = 17608, progressStorage = 17737, killsRequired = 500},
['efreet'] = {taskerStorage = 17608, progressStorage = 17737, killsRequired = 500},
['pirate skeleton'] = {taskerStorage = 17608, progressStorage = 17738, killsRequired = 600},
['pirate marauder'] = {taskerStorage = 17608, progressStorage = 17738, killsRequired = 600},
['pirate cutthroat'] = {taskerStorage = 17608, progressStorage = 17738, killsRequired = 600},
['pirate ghost'] = {taskerStorage = 17608, progressStorage = 17738, killsRequired = 600},
['pirate buccaneer'] = {taskerStorage = 17608, progressStorage = 17738, killsRequired = 600},
['pirate corsair'] = {taskerStorage = 17608, progressStorage = 17738, killsRequired = 600},
['orc spearman'] = {taskerStorage = 17608, progressStorage = 17712, killsRequired = 300},
['orc shaman'] = {taskerStorage = 17608, progressStorage = 17712, killsRequired = 300},
['orc rider'] = {taskerStorage = 17608, progressStorage = 17712, killsRequired = 300},
@ -84,56 +108,37 @@ local tasks = {
['orc'] = {taskerStorage = 17652, progressStorage = 17651, killsRequired = 50},
}
local function randomSort(arr)
local sorted = {}
local rand2
local rand
local mem
for i=1,#arr do
sorted[i] = arr[i]
end
if (#arr <= 1) then
return sorted;
end
for i=1,(#arr)^2 do
repeat
rand = math.random(1,#sorted)
rand2 = math.random(1,#sorted)
until rand ~= rand2
mem = sorted[rand]
sorted[rand] = pgtss[rand2]
sorted[rand2] = mem
end
return sorted
end
local maxPlayersInPartyShare = 2
-- not tested probably nothing is working
function onKill(player, target)
if target:isPlayer() or target:getMaster() then
function onDeath(creature, corpse, lasthitkiller, mostdamagekiller, lasthitunjustified, mostdamageunjustified)
if not creature:isMonster() or creature:getMaster() then
return true
end
local targetName = target:getName():lower()
local player = mostdamagekiller
if not mostdamagekiller:isPlayer() then
local master = mostdamagekiller:getMaster()
if master and master:isPlayer() then
player = master
else
return true
end
end
local targetName = creature:getName():lower()
local task = tasks[targetName]
if task ~= nil then
local players
local party = player:getParty()
if party ~= nil and party:isSharedExperienceEnabled() then
if party ~= nil and party:isSharedExperienceActive() then
players = party:getMembers() -- all members of the party
players[#players + 1] = party:getLeader() -- don't forget the leader
if #players > maxPlayersInPartyShare then -- if more than 4 players are in party than shuffle the table and give task bonus only for the first 4 players
players = randomSort(players)
end
else
players = { player } -- no party? then just the player
end
for i, member in ipairs(players) do
print(i)
if i < maxPlayersInPartyShare then
if i <= maxPlayersInPartyShare then
local inProgressQuest = member:getStorageValue(task.taskerStorage)
if inProgressQuest == task.progressStorage then
local playerQuestKills = member:getStorageValue(task.progressStorage)
@ -145,5 +150,5 @@ function onKill(player, target)
end
end
end
return true
return true
end

View File

@ -58,7 +58,6 @@ function onLogin(player)
player:registerEvent("PlayerLogout")
player:registerEvent("FirstItems")
player:registerEvent("RegenerateStamina")
player:registerEvent("KillingInTheNameOfKills")
return true
end

View File

@ -0,0 +1,76 @@
function onLogin(player)
local lastLogout = player:getLastLogout()
local offlineTime = lastLogout ~= 0 and math.min(os.time() - lastLogout, 86400 * 21) or 0
local offlineTrainingSkill = player:getOfflineTrainingSkill()
if offlineTrainingSkill == -1 then
player:addOfflineTrainingTime(offlineTime * 1000)
return true
end
player:setOfflineTrainingSkill(-1)
if offlineTime < 600 then
player:setBankBalance(player:getBankBalance() + 1000)
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You must be logged out for more than 10 minutes to start offline training. Your 1000 gold coins entree fee were returned to your bank account.")
return true
end
local trainingTime = math.max(0, math.min(offlineTime, math.min(43200 / 2, player:getOfflineTrainingTime() / 1000)))
player:removeOfflineTrainingTime(trainingTime * 1000)
local remainder = offlineTime - trainingTime
if remainder > 0 then
player:addOfflineTrainingTime(remainder * 1000)
end
if trainingTime < 60 then
return true
end
local text = "During your absence you trained for"
local hours = math.floor(trainingTime / 3600)
if hours > 1 then
text = string.format("%s %d hours", text, hours)
elseif hours == 1 then
text = string.format("%s 1 hour", text)
end
local minutes = math.floor((trainingTime % 3600) / 60)
if minutes ~= 0 then
if hours ~= 0 then
text = string.format("%s and", text)
end
if minutes > 1 then
text = string.format("%s %d minutes", text, minutes)
else
text = string.format("%s 1 minute", text)
end
end
text = string.format("%s.", text)
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, text)
local vocation = player:getVocation()
local promotion = vocation:getPromotion()
local topVocation = not promotion and vocation or promotion
local updateSkills = false
if table.contains({SKILL_CLUB, SKILL_SWORD, SKILL_AXE, SKILL_DISTANCE}, offlineTrainingSkill) then
local modifier = topVocation:getAttackSpeed() / 1000
updateSkills = player:addOfflineTrainingTries(offlineTrainingSkill, (trainingTime / modifier) / (offlineTrainingSkill == SKILL_DISTANCE and 8 or 4))
elseif offlineTrainingSkill == SKILL_MAGLEVEL then
local gainTicks = topVocation:getManaGainTicks() * 4
if gainTicks == 0 then
gainTicks = 1
end
updateSkills = player:addOfflineTrainingTries(SKILL_MAGLEVEL, trainingTime * (vocation:getManaGainAmount() / gainTicks))
end
if updateSkills then
player:addOfflineTrainingTries(SKILL_SHIELD, trainingTime / 8)
end
return true
end

View File

@ -2,96 +2,85 @@ local deathListEnabled = true
local maxDeathRecords = 50
function onDeath(player, corpse, killer, mostDamageKiller, unjustified, mostDamageUnjustified)
local playerId = player:getId()
local playerId = player:getId()
if nextUseStaminaTime[playerId] then
nextUseStaminaTime[playerId] = nil
end
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You are dead.")
-- restart blessings values
player:setStorageValue(101,0)
player:setStorageValue(102,0)
player:setStorageValue(103,0)
player:setStorageValue(104,0)
player:setStorageValue(105,0)
if not deathListEnabled then
return
end
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You are dead.")
-- restart blessings values
player:setStorageValue(101,0)
player:setStorageValue(102,0)
player:setStorageValue(103,0)
player:setStorageValue(104,0)
player:setStorageValue(105,0)
if not deathListEnabled then
return
end
local byPlayer = 0
local killerName
if killer ~= nil then
if killer:isPlayer() then
byPlayer = 1
else
local master = killer:getMaster()
if master and master ~= killer and master:isPlayer() then
killer = master
byPlayer = 1
end
end
killerName = killer:getName()
else
killerName = "field item"
end
local byPlayer = false
local killerName
if killer ~= nil then
if killer:isPlayer() then
byPlayer = true
else
local master = killer:getMaster()
if master and master ~= killer and master:isPlayer() then
killer = master
byPlayer = true
end
end
killerName = killer:getName()
else
killerName = "field item"
end
local byPlayerMostDamage = 0
local mostDamageKillerName
if mostDamageKiller ~= nil then
if mostDamageKiller:isPlayer() then
byPlayerMostDamage = 1
else
local master = mostDamageKiller:getMaster()
if master and master ~= mostDamageKiller and master:isPlayer() then
mostDamageKiller = master
byPlayerMostDamage = 1
end
end
mostDamageName = mostDamageKiller:getName()
else
mostDamageName = "field item"
end
local byPlayerMostDamage = 0
local mostDamageKillerName
if mostDamageKiller ~= nil then
if mostDamageKiller:isPlayer() then
byPlayerMostDamage = 1
else
local master = mostDamageKiller:getMaster()
if master and master ~= mostDamageKiller and master:isPlayer() then
mostDamageKiller = master
byPlayerMostDamage = 1
end
end
mostDamageName = mostDamageKiller:getName()
else
mostDamageName = "field item"
end
local playerGuid = player:getGuid()
db.query("INSERT INTO `player_deaths` (`player_id`, `time`, `level`, `killed_by`, `is_player`, `mostdamage_by`, `mostdamage_is_player`, `unjustified`, `mostdamage_unjustified`) VALUES (" .. playerGuid .. ", " .. os.time() .. ", " .. player:getLevel() .. ", " .. db.escapeString(killerName) .. ", " .. byPlayer .. ", " .. db.escapeString(mostDamageName) .. ", " .. byPlayerMostDamage .. ", " .. (unjustified and 1 or 0) .. ", " .. (mostDamageUnjustified and 1 or 0) .. ")")
local resultId = db.storeQuery("SELECT `player_id` FROM `player_deaths` WHERE `player_id` = " .. playerGuid)
local playerGuid = player:getGuid()
db.query("INSERT INTO `player_deaths` (`player_id`, `time`, `level`, `killed_by`, `is_player`, `mostdamage_by`, `mostdamage_is_player`, `unjustified`, `mostdamage_unjustified`) VALUES (" .. playerGuid .. ", " .. os.time() .. ", " .. player:getLevel() .. ", " .. db.escapeString(killerName) .. ", " .. (byPlayer and 1 or 0) .. ", " .. db.escapeString(mostDamageName) .. ", " .. byPlayerMostDamage .. ", " .. (unjustified and 1 or 0) .. ", " .. (mostDamageUnjustified and 1 or 0) .. ")")
local resultId = db.storeQuery("SELECT `player_id` FROM `player_deaths` WHERE `player_id` = " .. playerGuid)
local deathRecords = 0
local tmpResultId = resultId
while tmpResultId ~= false do
tmpResultId = result.next(resultId)
deathRecords = deathRecords + 1
end
local deathRecords = 0
local tmpResultId = resultId
while tmpResultId ~= false do
tmpResultId = result.next(resultId)
deathRecords = deathRecords + 1
end
if resultId ~= false then
result.free(resultId)
end
if resultId ~= false then
result.free(resultId)
end
local limit = deathRecords - maxDeathRecords
if limit > 0 then
db.asyncQuery("DELETE FROM `player_deaths` WHERE `player_id` = " .. playerGuid .. " ORDER BY `time` LIMIT " .. limit)
end
local limit = deathRecords - maxDeathRecords
if limit > 0 then
db.asyncQuery("DELETE FROM `player_deaths` WHERE `player_id` = " .. playerGuid .. " ORDER BY `time` LIMIT " .. limit)
end
if byPlayer == 1 then
local targetGuild = player:getGuild()
targetGuild = targetGuild and targetGuild:getId() or 0
if targetGuild ~= 0 then
local killerGuild = killer:getGuild()
killerGuild = killerGuild and killerGuild:getId() or 0
if killerGuild ~= 0 and targetGuild ~= killerGuild and isInWar(playerId, killer:getId()) then
local warId = false
resultId = db.storeQuery("SELECT `id` FROM `guild_wars` WHERE `status` = 1 AND ((`guild1` = " .. killerGuild .. " AND `guild2` = " .. targetGuild .. ") OR (`guild1` = " .. targetGuild .. " AND `guild2` = " .. killerGuild .. "))")
if resultId ~= false then
warId = result.getDataInt(resultId, "id")
result.free(resultId)
end
if not byPlayer then
return
end
if warId ~= false then
db.asyncQuery("INSERT INTO `guildwar_kills` (`killer`, `target`, `killerguild`, `targetguild`, `time`, `warid`) VALUES (" .. db.escapeString(killerName) .. ", " .. db.escapeString(player:getName()) .. ", " .. killerGuild .. ", " .. targetGuild .. ", " .. os.time() .. ", " .. warId .. ")")
end
end
end
end
end
local warId = guildwars:isInWar(killer, player)
if warId ~= 0 then
guildwars:processKill(warId, killer, player)
end
end

View File

@ -1,5 +1,38 @@
local trainingStatues = {17724, 17725, 17726, 17727, 17728}
function Player:onLook(thing, position, distance)
local description = "You see " .. thing:getDescription(distance)
if thing:isItem() and thing:getId() == 2028 then
if isInArray(trainingStatues, thing:getActionId()) then
local trainingTime = math.min(43200 / 2, self:getOfflineTrainingTime() / 1000)
local text = "You have"
local hours = math.floor(trainingTime / 3600)
if hours > 1 then
text = string.format("%s %d hours", text, hours)
elseif hours == 1 then
text = string.format("%s 1 hour", text)
end
local minutes = math.floor((trainingTime % 3600) / 60)
if minutes ~= 0 then
if hours ~= 0 then
text = string.format("%s and", text)
end
if minutes > 1 then
text = string.format("%s %d minutes", text, minutes)
else
text = string.format("%s 1 minute", text)
end
end
text = string.format(" %s offline training time remaining.", text)
description = string.format(description .. "%s", text)
end
end
if self:getGroup():getAccess() then
if thing:isItem() then
description = string.format("%s\nItem ID: %d", description, thing:getId())

View File

@ -48,4 +48,35 @@ end
if not nextUseStaminaTime then
nextUseStaminaTime = {}
end
function isInArray(array, value, isCaseSensitive)
local compareLowerCase = false
if value ~= nil and type(value) == "string" and not isCaseSensitive then
value = string.lower(value)
compareLowerCase = true
end
if array == nil or value == nil then
return (array == value), nil
end
local t = type(array)
if t ~= "table" then
if compareLowerCase and t == "string" then
return (string.lower(array) == string.lower(value)), nil
else
return (array == value), nil
end
end
for k,v in pairs(array) do
local newV
if compareLowerCase and type(v) == "string" then
newV = string.lower(v)
else
newV = v
end
if newV == value then
return true, k
end
end
return false
end

View File

@ -11218,17 +11218,17 @@ Attributes = {ChangeTarget=2541,Brightness=0,LightColor=215}
TypeID = 2543
Name = "a box"
Flags = {Chest,Unpass,Unmove,Height,Disguise}
Attributes = {,DisguiseTarget=2469}
Attributes = {DisguiseTarget=2469}
TypeID = 2544
Name = "a wooden coffin"
Flags = {Bottom,Chest,Unpass,Unmove,Height,Disguise}
Attributes = {,DisguiseTarget=2476}
Attributes = {DisguiseTarget=2476}
TypeID = 2545
Name = "a wooden coffin"
Flags = {Bottom,Chest,Unpass,Unmove,Height,Disguise}
Attributes = {,DisguiseTarget=2474}
Attributes = {DisguiseTarget=2474}
TypeID = 2546
Name = "a chest"
@ -11268,12 +11268,12 @@ Attributes = {DisguiseTarget=3634}
TypeID = 2553
Name = "drawers"
Flags = {Chest,Unpass,Unmove,Height,Disguise}
Attributes = {,DisguiseTarget=2433}
Attributes = {DisguiseTarget=2433}
TypeID = 2554
Name = "drawers"
Flags = {Chest,Unpass,Unmove,Height,Disguise}
Attributes = {,DisguiseTarget=2434}
Attributes = {DisguiseTarget=2434}
TypeID = 2555
Name = "a small hole"
@ -11293,27 +11293,27 @@ Attributes = {DisguiseTarget=4285}
TypeID = 2558
Name = "a bookcase"
Flags = {Chest,Unpass,Unmove,Unlay,Height,Disguise}
Attributes = {,DisguiseTarget=2435}
Attributes = {DisguiseTarget=2435}
TypeID = 2559
Name = "a bookcase"
Flags = {Chest,Unpass,Unmove,Unlay,Height,Disguise}
Attributes = {,DisguiseTarget=2438}
Attributes = {DisguiseTarget=2438}
TypeID = 2560
Name = "a stone coffin"
Flags = {Bottom,Chest,Unpass,Unmove,Height,Disguise}
Attributes = {,DisguiseTarget=1983}
Attributes = {DisguiseTarget=1983}
TypeID = 2561
Name = "a barrel"
Flags = {Chest,Unpass,Unmove,Height,Disguise}
Attributes = {,DisguiseTarget=2523}
Attributes = {DisguiseTarget=2523}
TypeID = 2562
Name = "a hollow stone"
Flags = {Bottom,Chest,Unpass,Unmove,Unlay,Height,Disguise}
Attributes = {,DisguiseTarget=1777}
Attributes = {DisguiseTarget=1777}
TypeID = 2563
Name = "a pile of bones"
@ -11323,12 +11323,12 @@ Attributes = {DisguiseTarget=4305}
TypeID = 2564
Name = "a sarcophagus"
Flags = {Bottom,Chest,Unpass,Unmove,Height,Disguise}
Attributes = {,DisguiseTarget=1994}
Attributes = {DisguiseTarget=1994}
TypeID = 2565
Name = "a sarcophagus"
Flags = {Bottom,Chest,Unpass,Unmove,Height,Disguise}
Attributes = {,DisguiseTarget=1992}
Attributes = {DisguiseTarget=1992}
TypeID = 2566
Name = "a lever"

View File

@ -372,6 +372,7 @@ function setPlayerGroupId(cid, groupId) local p = Player(cid) return p ~= nil an
function doPlayerSetSex(cid, sex) local p = Player(cid) return p ~= nil and p:setSex(sex) or false end
function doPlayerSetGuildLevel(cid, level) local p = Player(cid) return p ~= nil and p:setGuildLevel(level) or false end
function doPlayerSetGuildNick(cid, nick) local p = Player(cid) return p ~= nil and p:setGuildNick(nick) or false end
function doPlayerSetOfflineTrainingSkill(cid, skillId) local p = Player(cid) return p and p:setOfflineTrainingSkill(skillId) or false end
function doShowTextDialog(cid, itemId, text) local p = Player(cid) return p ~= nil and p:showTextDialog(itemId, text) or false end
function doPlayerAddItemEx(cid, uid, ...) local p = Player(cid) return p ~= nil and p:addItemEx(Item(uid), ...) or false end
function doPlayerRemoveItem(cid, itemid, count, ...) local p = Player(cid) return p ~= nil and p:removeItem(itemid, count, ...) or false end

View File

@ -9,4 +9,5 @@ dofile('data/lib/core/player.lua')
dofile('data/lib/core/position.lua')
dofile('data/lib/core/teleport.lua')
dofile('data/lib/core/tile.lua')
dofile('data/lib/core/vocation.lua')
dofile('data/lib/core/vocation.lua')
dofile('data/lib/core/guildwars.lua')

199
data/lib/core/guildwars.lua Normal file
View File

@ -0,0 +1,199 @@
guildwars = {}
guildwars.__index = guildwars
function guildwars:isInWar(player1, player2)
if not player1:getGuild() or not player2:getGuild() then
return 0
end
if player1:getGuild():getId() == 0 or player2:getGuild():getId() == 0 then
return 0
end
if player1:getGuild():getId() == player2:getGuild():getId() then
return 0
end
return isInWar(player1:getId(), player2:getId())
end
function guildwars:processKill(warId, killer, player)
local fragLimit = self:getFragLimit(warId)
local killerFrags = self:getKills(warId, killer:getGuild():getId()) + 1
local deadFrags = self:getKills(warId, player:getGuild():getId())
local killerMsg = "Opponent " .. player:getName() .. " of the " .. player:getGuild():getName() .. " was killed by " .. killer:getName() .. ". The new score is " .. killerFrags .. ":" .. deadFrags .. " frags (limit " .. fragLimit .. ")."
sendGuildChannelMessage(killer:getGuild():getId(), TALKTYPE_CHANNEL_O, killerMsg)
local deadMsg = "Guild member " .. player:getName() .. " was killed by " .. killer:getName() .. " of the " .. killer:getGuild():getName() .. ". The new score is " .. deadFrags .. ":" .. killerFrags .. " frags (limit " .. fragLimit .. ")."
sendGuildChannelMessage(player:getGuild():getId(), TALKTYPE_CHANNEL_O, deadMsg)
self:insertKill(warId, killer, player)
if killerFrags >= fragLimit then
self:endWar(warId, killer, player, killerFrags)
end
end
function guildwars:getFragLimit(warId)
local resultId = db.storeQuery("SELECT `frag_limit` FROM `guild_wars` WHERE `id` = " .. warId)
if resultId ~= false then
local frag_limit = result.getDataInt(resultId, "frag_limit")
result.free(resultId)
return frag_limit
end
return 0
end
function guildwars:getBounty(warId)
local resultId = db.storeQuery("SELECT `bounty` FROM `guild_wars` WHERE `id` = " .. warId)
if resultId ~= false then
local bounty = result.getDataInt(resultId, "bounty")
result.free(resultId)
return bounty
end
return 0
end
function guildwars:getKills(warId, guildId)
local resultId = db.storeQuery("SELECT COUNT(*) as frags FROM `guildwar_kills` WHERE `warid` = " .. warId .. " and `killerguild` = " .. guildId)
if resultId ~= false then
local frags = result.getDataInt(resultId, "frags")
result.free(resultId)
return frags
end
return 0
end
function guildwars:insertKill(warId, killer, target)
db.asyncQuery("INSERT INTO `guildwar_kills` (`killer`, `target`, `killerguild`, `targetguild`, `warid`, `time`) VALUES (" .. db.escapeString(killer:getName()) .. ", " .. db.escapeString(target:getName()) .. ", " .. killer:getGuild():getId() .. ", " .. target:getGuild():getId() .. ", " .. warId .. ", " .. os.time() .. ")")
end
function guildwars:endWar(warId, killer, player, frags)
local winGuildInternalMessage = "Congratulations! You have won the war against " .. player:getGuild():getName() .. " with " .. frags .. " frags."
sendGuildChannelMessage(killer:getGuild():getId(), TALKTYPE_CHANNEL_O, winGuildInternalMessage)
local loseGuildInternalMessage = "You have lost the war against " .. killer:getGuild():getName() .. ". They have reached the limit of " .. frags .. " frags."
sendGuildChannelMessage(player:getGuild():getId(), TALKTYPE_CHANNEL_O, loseGuildInternalMessage)
broadcastMessage(killer:getGuild():getName() .. " have won the war against " .. player:getGuild():getName() .. " with " .. frags .. " frags.", MESSAGE_EVENT_ADVANCE)
self:updateState(warId, 5)
self:setWarEmblem(killer:getGuild(), player:getGuild())
local bounty = self:getBounty(warId)
if bounty > 0 then
killer:getGuild():increaseBankBalance(bounty * 2)
end
end
function guildwars:setWarEmblem(guild1, guild2)
guild1:setGuildWarEmblem(guild2)
end
function guildwars:updateState(warId, status)
db.query("UPDATE `guild_wars` SET `status` = " .. status .. " WHERE `id` = " .. warId)
end
function guildwars:getPendingInvitation(guild1, guild2)
local resultId = db.storeQuery("SELECT `id`, `bounty` FROM `guild_wars` WHERE `guild1` = " .. guild1 .. " AND `guild2` = " .. guild2 .. " AND `status` = 0")
if resultId then
local id = result.getDataInt(resultId, "id")
local bounty = result.getDataInt(resultId, "bounty")
result.free(resultId)
return id, bounty
end
return 0
end
function guildwars:startWar(player, warId, guild1, guild2, bounty)
if bounty > 0 then
local guildBalance = guild1:getBankBalance()
if guildBalance < bounty then
player:sendCancelMessage("Your guild does not have that much money in the bank account balance to accept this war with the bounty of " .. bounty .. " gold.")
return true
end
if not guild1:decreaseBankBalance(bounty) then
player:sendCancelMessage("Your guild does not have that much money in the bank account balance to accept this war with the bounty of " .. bounty .. " gold.")
return true
end
end
self:updateState(warId, 1)
self:setWarEmblem(guild1, guild2)
broadcastMessage(guild1:getName() .. " has accepted " .. guild2:getName() .. " invitation to war.", MESSAGE_EVENT_ADVANCE)
end
function guildwars:rejectWar(warId, guild1, guild2, bounty)
self:updateState(warId, 2)
broadcastMessage(guild1:getName() .. " has rejected " .. guild2:getName() .. " invitation to war.", MESSAGE_EVENT_ADVANCE)
if bounty > 0 then
guild2:increaseBankBalance(bounty)
end
end
function guildwars:cancelWar(warId, guild1, guild2, bounty)
self:updateState(warId, 3)
broadcastMessage(guild1:getName() .. " has canceled invitation to a war with " .. guild2:getName() .. ".", MESSAGE_EVENT_ADVANCE)
if bounty > 0 then
guild1:increaseBankBalance(bounty)
end
end
function guildwars:invite(player, guild1, guild2, frags, bounty)
local str = ""
local tmpQuery = db.storeQuery("SELECT `guild1`, `status` FROM `guild_wars` WHERE `guild1` IN (" .. guild1:getId() .. "," .. guild2:getId() .. ") AND `guild2` IN (" .. guild2:getId() .. "," .. guild1:getId() .. ") AND `status` IN (0, 1)")
if tmpQuery then
if result.getDataInt(tmpQuery, "status") == 0 then
if result.getDataInt(tmpQuery, "guild1") == guild1:getId() then
str = "You have already invited " .. guild2:getName() .. " to war."
else
str = guild2:getName() .. " have already invited you to war."
end
else
str = "You are already on a war with " .. guild2:getName() .. "."
end
result.free(tmpQuery)
end
if str ~= "" then
player:sendCancelMessage(str)
return true
end
frags = math.max(10, math.min(500, frags))
bounty = math.max(0, math.min(10000000, bounty))
if bounty > 0 then
local guildBalance = guild1:getBankBalance()
if guildBalance < bounty then
player:sendCancelMessage("Your guild does not have that much money in the bank account balance to set this bounty.")
return true
end
if not guild1:decreaseBankBalance(bounty) then
player:sendCancelMessage("Your guild does not have that much money in the bank account balance to set this bounty.")
return true
end
end
db.asyncQuery("INSERT INTO `guild_wars` (`guild1`, `guild2`, `frag_limit`, `bounty`) VALUES (" .. guild1:getId() .. ", " .. guild2:getId() .. ", " .. frags .. ", " .. bounty .. ");")
local message = guild1:getName() .. " has invited " .. guild2:getName() .. " to war for " .. frags .. " frags."
if bounty > 0 then
message = message .. " The bounty reward is set to " .. bounty .. " gold."
end
broadcastMessage(message, MESSAGE_EVENT_ADVANCE)
end

View File

@ -39,14 +39,17 @@
<voice sentence="Praise voodoo!" />
</voices>
<loot>
<item id="3085" chance="14" /><!-- dragon necklace -->
<item id="2843" chance="13" /><!-- book -->
<item id="5810" chance="14" /><!-- pirate voodoo doll -->
<item id="6088" chance="10" /><!-- music sheet -->
<item id="3282" chance="56" /><!-- morning star -->
<item id="3052" chance="9" /><!-- life ring -->
<item id="3031" countmax="40" chance="240" /><!-- gold coin -->
<item id="3032" chance="10" /><!-- small emerald -->
<item id="3065" chance="7" /><!-- terra rod -->
</loot>
<item id="3085" chance="14" /><!-- dragon necklace -->
<item id="2843" chance="13" /><!-- book -->
<item id="5810" chance="14" /><!-- pirate voodoo doll -->
<item id="6088" chance="10" /><!-- music sheet -->
<item id="3282" chance="56" /><!-- morning star -->
<item id="3052" chance="9" /><!-- life ring -->
<item id="3031" countmax="40" chance="240" /><!-- gold coin -->
<item id="3032" chance="10" /><!-- small emerald -->
<item id="3065" chance="7" /><!-- terra rod -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -39,15 +39,18 @@
<summon name="Ghoul" chance="10" max="2" />
</summons>
<loot>
<item id="3053" chance="9" /><!-- time ring -->
<item id="5810" chance="19" /><!-- pirate voodoo doll -->
<item id="2843" chance="13" /><!-- book -->
<item id="3054" chance="15" /><!-- silver amulet -->
<item id="3031" countmax="60" chance="227" /><!-- gold coin -->
<item id="3311" chance="14" /><!-- clerical mace -->
<item id="6089" chance="10" /><!-- music sheet -->
<item id="3067" chance="7" /><!-- hailstorm rod -->
<item id="3566" chance="6" /><!-- red robe -->
<item id="3030" chance="7" /><!-- small ruby -->
</loot>
<item id="3053" chance="9" /><!-- time ring -->
<item id="5810" chance="19" /><!-- pirate voodoo doll -->
<item id="2843" chance="13" /><!-- book -->
<item id="3054" chance="15" /><!-- silver amulet -->
<item id="3031" countmax="60" chance="227" /><!-- gold coin -->
<item id="3311" chance="14" /><!-- clerical mace -->
<item id="6089" chance="10" /><!-- music sheet -->
<item id="3067" chance="7" /><!-- hailstorm rod -->
<item id="3566" chance="6" /><!-- red robe -->
<item id="3030" chance="7" /><!-- small ruby -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -1,4 +1,4 @@
<monster name="Azure Frog" namedescription="a azure frog" race="blood" experience="20" speed="95" manacost="305">
<monster name="Azure Frog" nameDescription="a azure frog" race="blood" experience="20" speed="95" manacost="305">
<health now="60" max="60" />
<look type="226" head="69" body="66" legs="69" feet="66" corpse="6079" />
<targetchange interval="1000" chance="50" />

View File

@ -26,8 +26,11 @@
<immunity invisible="0" />
</immunities>
<loot>
<item id="3031" countmax="45" chance="187" /><!-- gold coin -->
<item id="3492" countmax="2" chance="22" /><!-- worm -->
<item id="3577" chance="100" /><!-- meat -->
</loot>
<item id="3031" countmax="45" chance="187" /><!-- gold coin -->
<item id="3492" countmax="2" chance="22" /><!-- worm -->
<item id="3577" chance="100" /><!-- meat -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -1,4 +1,4 @@
<monster name="Coral Frog" namedescription="a coral frog" race="blood" experience="20" speed="95" manacost="305">
<monster name="Coral Frog" nameDescription="a coral frog" race="blood" experience="20" speed="95" manacost="305">
<health now="60" max="60" />
<look type="226" head="114" body="98" legs="97" feet="114" corpse="6079" />
<targetchange interval="1000" chance="50" />

View File

@ -60,4 +60,7 @@
<item id="3055" chance="6" /><!-- platinum amulet -->
<item id="2995" chance="5" /><!-- piggy bank -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -45,4 +45,7 @@
<item id="3074" chance="11" /><!-- wand of vortex -->
<item id="5810" chance="10" /><!-- pirate voodoo doll -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -30,20 +30,23 @@
<voice sentence="Plundeeeeer!" />
</voices>
<loot>
<item id="3031" countmax="59" chance="275" /><!-- gold coin -->
<item id="6095" chance="15" /><!-- pirate shirt -->
<item id="3273" chance="108" /><!-- sabre -->
<item id="2920" chance="103" /><!-- torch -->
<item id="3298" countmax="5" chance="60" /><!-- throwing knife -->
<item id="5090" chance="18" /><!-- treasure map -->
<item id="3123" chance="104" /><!-- worn leather boots -->
<item id="5926" chance="8" /><!-- pirate backpack -->
<item id="6097" chance="10" /><!-- hook -->
<item id="6098" chance="9" /><!-- eye patch -->
<item id="3413" chance="44" /><!-- battle shield -->
<item id="3357" chance="11" /><!-- plate armor -->
<item id="6126" chance="8" /><!-- peg leg -->
<item id="5792" chance="5" /><!-- dice -->
<item id="5552" chance="5" /><!-- rum flask -->
</loot>
<item id="3031" countmax="59" chance="275" /><!-- gold coin -->
<item id="6095" chance="15" /><!-- pirate shirt -->
<item id="3273" chance="108" /><!-- sabre -->
<item id="2920" chance="103" /><!-- torch -->
<item id="3298" countmax="5" chance="60" /><!-- throwing knife -->
<item id="5090" chance="18" /><!-- treasure map -->
<item id="3123" chance="104" /><!-- worn leather boots -->
<item id="5926" chance="8" /><!-- pirate backpack -->
<item id="6097" chance="10" /><!-- hook -->
<item id="6098" chance="9" /><!-- eye patch -->
<item id="3413" chance="44" /><!-- battle shield -->
<item id="3357" chance="11" /><!-- plate armor -->
<item id="6126" chance="8" /><!-- peg leg -->
<item id="5792" chance="5" /><!-- dice -->
<item id="5552" chance="5" /><!-- rum flask -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -47,4 +47,7 @@
<item id="6096" chance="12" /><!-- pirate hat -->
<item id="5813" chance="6" /><!-- skull candle -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -43,4 +43,7 @@
<item id="5552" chance="6" /><!-- rum flask -->
<item id="5792" chance="5" /><!-- dice -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -48,4 +48,7 @@
<item id="3271" chance="7" /><!-- spike sword -->
<item id="3566" chance="7" /><!-- red robe -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -45,4 +45,7 @@
<item id="5928" chance="6" /><!-- goldfish bowl -->
<item id="5792" chance="6" /><!-- dice -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -27,4 +27,7 @@
<item id="3337" chance="18" /><!-- bone club -->
<item id="3264" chance="12" /><!-- sword -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -36,4 +36,7 @@
<item id="5895" chance="10" /><!-- fish fin -->
<item id="3033" chance="9" /><!-- small amethyst -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -49,4 +49,7 @@
<item id="5895" chance="10" /><!-- fish fin -->
<item id="3294" chance="70" /><!-- short sword -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -58,4 +58,7 @@
<item id="3098" chance="8" /><!-- ring of healing -->
<item id="3370" chance="8" /><!-- knight armor -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -64,4 +64,7 @@
<item id="3370" chance="8" /><!-- knight armor -->
<item id="5895" chance="15" /><!-- fish fin -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -38,4 +38,7 @@
<item id="3265" chance="16" /><!-- two handed sword -->
<item id="3029" chance="5" /><!-- small sapphire -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -48,4 +48,7 @@
<item id="3373" chance="6" /><!-- strange helmet -->
<item id="3567" chance="6" /><!-- blue robe -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -45,4 +45,7 @@
<item id="3061" chance="10" /><!-- life crystal -->
<item id="5895" chance="10" /><!-- fish fin -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -44,4 +44,7 @@
<item id="5895" chance="20" /><!-- fish fin -->
<item id="3381" chance="8" /><!-- crown armor -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -36,4 +36,7 @@
<item id="3028" chance="9" /><!-- small diamond -->
<item id="5895" chance="9" /><!-- fish fin -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -45,4 +45,7 @@
<item id="3581" chance="54" /><!-- shrimp -->
<item id="5895" chance="24" /><!-- fish fin -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -28,4 +28,7 @@
<item id="5678" countmax="3" chance="10" /><!-- tortoise egg -->
<item id="3279" chance="10" /><!-- war hammer -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -67,4 +67,7 @@
<item id="5668" chance="2" /><!-- mysterious voodoo skull -->
<item id="3155" countmax="8" chance="42" /><!-- sudden death rune -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -62,4 +62,7 @@
<item id="3340" chance="4" /><!-- heavy mace -->
<item id="3342" chance="4" /><!-- war axe -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -62,4 +62,7 @@
<item id="5668" chance="1" /><!-- mysterious voodoo skull -->
<item id="3342" chance="95" /><!-- war axe -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -47,4 +47,7 @@
<item id="3071" chance="8" /><!-- wand of inferno -->
<item id="3010" chance="5" /><!-- emerald bangle -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -39,4 +39,7 @@
<item id="3426" countmax="1" chance="50" /> <!-- a studded shield -->
<item id="2920" countmax="1" chance="50" /> <!-- a torch -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -65,4 +65,7 @@
<item id="3033" countmax="4" chance="12" /> <!-- a small amethyst -->
<item id="3032" countmax="3" chance="6" /> <!-- a small emerald -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -37,4 +37,7 @@
<item id="3577" countmax="1" chance="100" /> <!-- meat -->
<item id="3279" countmax="1" chance="1" /> <!-- a war hammer -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -68,4 +68,7 @@
<item id="3004" countmax="1" chance="5" /> <!-- a wedding ring -->
<item id="3026" countmax="1" chance="10" /> <!-- a white pearl -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -31,4 +31,7 @@
<item id="5896" countmax="1" chance="25" /> <!-- bear paw -->
<item id="5902" countmax="1" chance="10" /> <!-- honeycomb -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -59,4 +59,7 @@
<item id="5893" countmax="1" chance="9" /> <!-- perfect behemoth fang -->
<item id="5930" countmax="1" chance="9" /> <!-- behemoth claw -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -67,4 +67,7 @@
<item id="3412" countmax="1" chance="30" /> <!-- a wooden shield -->
<item id="5898" countmax="1" chance="8" /> <!-- beholder eye -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -61,4 +61,7 @@
<item id="3029" countmax="4" chance="25" /> <!-- a small sapphire -->
<item id="5912" countmax="1" chance="10" /> <!-- a blue piece of cloth -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -55,4 +55,7 @@
<item id="3114" countmax="1" chance="200" /> <!-- a skull -->
<item id="5925" countmax="1" chance="10" /> <!-- a hardened bone -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -24,4 +24,7 @@
<item id="3590" countmax="3" chance="30" /> <!-- a cherry -->
<item id="3031" countmax="6" chance="350" /> <!-- a gold coin -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -48,4 +48,7 @@
<item id="3738" countmax="1" chance="5" /> <!-- a sling herb -->
<item id="3738" countmax="1" chance="5" /> <!-- a sling herb -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -30,4 +30,7 @@
<item id="3031" countmax="2" chance="850" /> <!-- a gold coin -->
<item id="3492" countmax="3" chance="500" /> <!-- a worm -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -28,4 +28,7 @@
<item id="3559" countmax="1" chance="80" /> <!-- leather legs -->
<item id="3577" countmax="4" chance="700" /> <!-- meat -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -40,4 +40,7 @@
<item id="3294" countmax="1" chance="80" /> <!-- a short sword -->
<item id="3012" countmax="1" chance="2" /> <!-- a wolf tooth chain -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -81,4 +81,7 @@
<item id="5954" countmax="1" chance="100" /> <!-- a demon horn -->
<item id="5776" countmax="1" chance="1" /> <!-- a Sabrehaven talon -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -39,4 +39,7 @@
<item id="3287" countmax="3" chance="100" /> <!-- a throwing star -->
<item id="2920" countmax="1" chance="500" /> <!-- a torch -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -63,4 +63,7 @@
<item id="5877" countmax="1" chance="10" /> <!-- green dragon leather -->
<item id="5920" countmax="1" chance="10" /> <!-- green dragon scale -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -64,4 +64,7 @@
<item id="5882" countmax="1" chance="18" /> <!-- red dragon scale -->
<item id="5948" countmax="1" chance="10" /> <!-- red dragon leather -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -39,4 +39,7 @@
<item id="3723" countmax="1" chance="500" /> <!-- a white mushroom -->
<item id="5880" countmax="1" chance="7" /> <!-- iron ore -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -53,4 +53,7 @@
<item id="3723" countmax="2" chance="600" /> <!-- a white mushroom -->
<item id="5880" countmax="1" chance="1" /> <!-- Iron Ore -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -40,4 +40,7 @@
<item id="3723" countmax="2" chance="550" /> <!-- a white mushroom -->
<item id="5880" countmax="1" chance="8" /> <!-- iron ore -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -42,4 +42,7 @@
<item id="3723" countmax="2" chance="400" /> <!-- a white mushroom -->
<item id="5880" countmax="1" chance="6" /> <!-- iron ore -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -77,4 +77,7 @@
<item id="3071" countmax="1" chance="5" /> <!-- a wand of inferno -->
<item id="5910" countmax="1" chance="25" /> <!-- green piece of cloth -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -73,4 +73,7 @@
<item id="3265" countmax="1" chance="60" /> <!-- a two handed sword -->
<item id="5898" countmax="1" chance="8" /> <!-- beholder eye -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -43,4 +43,7 @@
<item id="3376" countmax="1" chance="150" /> <!-- a studded helmet -->
<item id="5921" countmax="1" chance="10" /> <!-- a heaven blossom -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -67,4 +67,7 @@
<item id="3037" countmax="1" chance="2" /> <!-- a yellow gem -->
<item id="5922" countmax="1" chance="25" /> <!-- a holy orchid -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -46,4 +46,7 @@
<item id="2901" countmax="1" chance="140" /> <!-- a waterskin -->
<item id="5921" countmax="1" chance="10" /> <!-- a heaven blossom -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -34,4 +34,7 @@
<item id="3130" countmax="1" chance="80" /> <!-- twigs -->
<item id="3412" countmax="1" chance="150" /> <!-- a wooden shield -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -49,4 +49,7 @@
<item id="3336" countmax="1" chance="80" /> <!-- a studded club -->
<item id="3012" countmax="1" chance="2" /> <!-- a wolf tooth chain -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -43,4 +43,7 @@
<item id="3049" countmax="1" chance="2" /> <!-- a stealth ring -->
<item id="5909" countmax="1" chance="8" /> <!-- white piece of cloth -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -42,4 +42,7 @@
<item id="3492" countmax="6" chance="800" /> <!-- a worm -->
<item id="5913" countmax="1" chance="10" /> <!-- a brown piece of cloth -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -49,4 +49,7 @@
<item id="3053" countmax="1" chance="7" /> <!-- a time ring -->
<item id="5879" countmax="1" chance="21" /> <!-- spider silk -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -43,4 +43,7 @@
<item id="3462" countmax="1" chance="100" /> <!-- a small axe -->
<item id="1781" countmax="3" chance="300" /> <!-- a small stone -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -62,4 +62,7 @@
<item id="2933" countmax="1" chance="75" /> <!-- a small oil lamp -->
<item id="5910" countmax="1" chance="25" /> <!-- green piece of cloth -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -63,4 +63,7 @@
<item id="3004" countmax="1" chance="50" /> <!-- a wedding ring -->
<item id="5911" countmax="1" chance="25" /> <!-- a red piece of cloth -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -28,4 +28,7 @@
<item id="3577" countmax="2" chance="500" /> <!-- meat -->
<item id="3492" countmax="3" chance="500" /> <!-- a worm -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -60,4 +60,7 @@
<item id="3081" countmax="1" chance="8" /> <!-- a stone skin amulet -->
<item id="3369" countmax="1" chance="10" /> <!-- a warrior helmet -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -39,4 +39,7 @@
<item id="3084" countmax="1" chance="10" /> <!-- a protection amulet -->
<item id="5883" countmax="1" chance="8" /> <!-- ape fur -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -28,4 +28,7 @@
<item id="3031" countmax="10" chance="350" /> <!-- a gold coin -->
<item id="3577" countmax="1" chance="300" /> <!-- meat -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -73,4 +73,7 @@
<item id="3373" countmax="1" chance="5" /> <!-- a strange helmet -->
<item id="3026" countmax="1" chance="25" /> <!-- a white pearl -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -27,4 +27,7 @@
<item id="3582" countmax="2" chance="200" /> <!-- ham -->
<item id="3577" countmax="3" chance="450" /> <!-- meat -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -42,4 +42,7 @@
<item id="5876" countmax="1" chance="9" /> <!-- lizard leather -->
<item id="5881" countmax="1" chance="9" /><!-- lizard scale -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -57,4 +57,7 @@
<item id="5876" countmax="1" chance="9" /> <!-- lizard leather -->
<item id="5881" countmax="1" chance="9" /><!-- lizard scale -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -39,4 +39,7 @@
<item id="5876" countmax="1" chance="10" /> <!-- lizard leather -->
<item id="5881" countmax="1" chance="10" /><!-- lizard scale -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -77,4 +77,7 @@
<item id="2948" countmax="1" chance="3" /> <!-- a wooden flute -->
<item id="5912" countmax="1" chance="25" /> <!-- a blue piece of cloth -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -54,4 +54,7 @@
<item id="3072" countmax="1" chance="10" /> <!-- a wand of plague -->
<item id="5883" countmax="1" chance="8" /> <!-- ape fur -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -39,4 +39,7 @@
<item id="3264" countmax="1" chance="100" /> <!-- a sword -->
<item id="5878" countmax="1" chance="8" /> <!-- minotaur leather -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -41,4 +41,7 @@
<item id="3375" countmax="1" chance="20" /> <!-- a soldier helmet -->
<item id="5878" countmax="1" chance="10" /> <!-- minotaur leather -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -37,4 +37,7 @@
<item id="3577" countmax="1" chance="100" /> <!-- meat -->
<item id="5878" countmax="1" chance="10" /> <!-- minotaur leather -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -53,4 +53,7 @@
<item id="3073" countmax="1" chance="5" /> <!-- a wand of cosmic energy -->
<item id="5878" countmax="1" chance="10" /> <!-- minotaur leather -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -55,4 +55,7 @@
<item id="3294" countmax="1" chance="150" /> <!-- a short sword -->
<item id="3324" countmax="1" chance="1" /> <!-- a skull staff -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -34,4 +34,7 @@
<item id="3376" countmax="1" chance="90" /> <!-- a studded helmet -->
<item id="3426" countmax="1" chance="100" /> <!-- a studded shield -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -38,4 +38,7 @@
<item id="3582" countmax="1" chance="170" /> <!-- ham -->
<item id="2914" countmax="1" chance="80" /> <!-- a lamp -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

View File

@ -47,4 +47,7 @@
<item id="3298" countmax="4" chance="100" /> <!-- a throwing knife -->
<item id="3369" countmax="1" chance="1" /> <!-- a warrior helmet -->
</loot>
<script>
<event name="KillingInTheNameOf" />
</script>
</monster>

Some files were not shown because too many files have changed in this diff Show More