mirror of
https://github.com/ErikasKontenis/SabrehavenServer.git
synced 2025-04-29 17:19:20 +02:00
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:
commit
3bd1a6f07e
@ -1 +1 @@
|
||||
next: 17723
|
||||
next: 17739
|
33
config.lua
33
config.lua
@ -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"
|
||||
|
@ -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." />
|
||||
|
@ -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>
|
@ -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" />
|
||||
|
50
data/actions/scripts/misc/christmas_bundle.lua
Normal file
50
data/actions/scripts/misc/christmas_bundle.lua
Normal 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
|
30
data/actions/scripts/misc/skill_trainer.lua
Normal file
30
data/actions/scripts/misc/skill_trainer.lua
Normal 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
|
@ -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>
|
||||
|
@ -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
|
@ -58,7 +58,6 @@ function onLogin(player)
|
||||
player:registerEvent("PlayerLogout")
|
||||
player:registerEvent("FirstItems")
|
||||
player:registerEvent("RegenerateStamina")
|
||||
player:registerEvent("KillingInTheNameOfKills")
|
||||
|
||||
return true
|
||||
end
|
||||
|
76
data/creaturescripts/scripts/offlinetraining.lua
Normal file
76
data/creaturescripts/scripts/offlinetraining.lua
Normal 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
|
@ -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.")
|
||||
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)
|
||||
-- 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
|
||||
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
|
||||
|
||||
local warId = guildwars:isInWar(killer, player)
|
||||
if warId ~= 0 then
|
||||
guildwars:processKill(warId, killer, player)
|
||||
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
|
@ -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())
|
||||
|
@ -49,3 +49,34 @@ 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
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -10,3 +10,4 @@ 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/guildwars.lua')
|
199
data/lib/core/guildwars.lua
Normal file
199
data/lib/core/guildwars.lua
Normal 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
|
@ -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>
|
@ -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>
|
@ -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" />
|
||||
|
@ -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>
|
@ -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" />
|
||||
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -43,4 +43,7 @@
|
||||
<item id="5552" chance="6" /><!-- rum flask -->
|
||||
<item id="5792" chance="5" /><!-- dice -->
|
||||
</loot>
|
||||
<script>
|
||||
<event name="KillingInTheNameOf" />
|
||||
</script>
|
||||
</monster>
|
@ -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>
|
@ -45,4 +45,7 @@
|
||||
<item id="5928" chance="6" /><!-- goldfish bowl -->
|
||||
<item id="5792" chance="6" /><!-- dice -->
|
||||
</loot>
|
||||
<script>
|
||||
<event name="KillingInTheNameOf" />
|
||||
</script>
|
||||
</monster>
|
@ -27,4 +27,7 @@
|
||||
<item id="3337" chance="18" /><!-- bone club -->
|
||||
<item id="3264" chance="12" /><!-- sword -->
|
||||
</loot>
|
||||
<script>
|
||||
<event name="KillingInTheNameOf" />
|
||||
</script>
|
||||
</monster>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -45,4 +45,7 @@
|
||||
<item id="3581" chance="54" /><!-- shrimp -->
|
||||
<item id="5895" chance="24" /><!-- fish fin -->
|
||||
</loot>
|
||||
<script>
|
||||
<event name="KillingInTheNameOf" />
|
||||
</script>
|
||||
</monster>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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
Loading…
x
Reference in New Issue
Block a user