• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Xikini's Free Scripting Service. [0.3.7 & (0.3.6/0.4)]

Status
Not open for further replies.

Xikini

I whore myself out for likes
Senator
Joined
Nov 17, 2010
Messages
6,814
Solutions
585
Reaction score
5,379
Doing quick (30 min or less) scripts for [0.3.7 & (0.3.6/0.4)]
I am not here to fix your broken scripts, although I will give advice if requested.
I am here for script requests of scripts not already available on the forum.
If you require support for your scripting issues please make a thread in the support section.

For clarity's sake,
I will script actionscripts, creaturescripts, globalevents, talkactions, movements, npcs for you.
I will not script spells, weapons, raids or monster scripts.
Additionally, source editing, websites and database queries are a no go as well.

Code:
How to make shorter links to posts.
https://otland.net/threads/234306/page-14#post-2330703
 
Last edited:
Hello!

I'd like to request a spell:

You need to be in front of the target, this spell push you away 2-3sqm and deals damage based on your weapon/skill :D

Is that possible? :D
You need to tell Xikini the distro
Wouldn't matter. The spells section confuses the shit out of me. :(
I've tried multiple times but everything is backwards, and none of the regular functions work. T.T
I can't make spells. Sorry. :/
 
could you give me an npc that I need to bring custom amount of items to in order to receive an item?
I tried creating this like 15 minutes after your post.
Everything looked fine but my npc wouldn't talk to me. I have no idea why, and there were no error's. I'll try re-creating it again now that I'm more awake. :p

-- Edit 1
Success!

khAxBpZ.png


-- Edit 2

Now this is fully working, and green-texted, I will post another soon that gives easy customization, without green-text

Example NPC

data/npc/Test.xml

Code:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="Test" script="data/npc/scripts/test.lua" walkinterval="500" floorchange="0">
   <health now="100" max="100"/>
   <look type="137" head="78" body="51" legs="86" feet="33" addons="3"/>
</npc>
data/npc/scripts/test.lua
Code:
--[[
__.....__.._______...__....__.._______...___.....__..._______..
\.\..././.|__...__|.|..|.././.|__...__|.|...\...|..|.|__...__|.
.\.\././.....|.|....|..|././.....|.|....|....\..|..|....|.|....
..\.../......|.|....|..|/./......|.|....|..|\.\.|..|....|.|....
../...\......|.|....|.....\......|.|....|..|.\.\|..|....|.|....
././.\.\...__|.|....|..|\..\...__|.|....|..|..\....|..__|.|....
/_/...\_\.|_______|.|__| \__\.|_______|.|__|...\___|.|_______|.

https://otland.net/threads/xikinis-free-scripting-service-0-3-7-0-3-6-0-4.234306/page-8#post-2291088

]]--

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
msgcontains = doMessageCheck -- I beleive I added this at some point because of an issue I was having. If it causes you issues, just remove it.

function onCreatureAppear(cid)  npcHandler:onCreatureAppear(cid)  end
function onCreatureDisappear(cid)  npcHandler:onCreatureDisappear(cid)  end
function onCreatureSay(cid, type, msg)  npcHandler:onCreatureSay(cid, type, msg)  end
function onThink()  npcHandler:onThink()  end

function greet(cid)     talkState[cid] = 0     return true   end
function getNpcName()     return getCreatureName(getNpcId())   end
 
function creatureSayCallback(cid, type, msg)
  if(not npcHandler:isFocused(cid)) then
     return false
  end
 
   local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
 
 
   if msgcontains(msg, "job") then
     selfSay("My job is to show the world how fashionable they can be!", cid)
     talkState[talkUser] = 0
   elseif msgcontains(msg, "name") then
     selfSay("My name is " .. getNpcName() .. ".", cid)
     talkState[talkUser] = 0
 
   -- Give player indication of turn in quest
   elseif msgcontains(msg, "demonic essence") and getPlayerStorageValue(cid, 45001) < 1 then
     selfSay("Bring 10 demonic essence and I'll give you 1 crystal coin. Okay? Okay.", cid)
     setPlayerStorageValue(cid, 45001, 1)
     talkState[talkUser] = 0
   -- Advise player of continuation
   elseif msgcontains(msg, "demonic essence") and getPlayerStorageValue(cid, 45001) == 1 then
     selfSay("Have you brought the demonic essence?", cid)
     talkState[talkUser] = 1
   -- Obtain response
   elseif msgcontains(msg, "yes") and talkState[talkUser] == 1 then
     -- Check for items
     if getPlayerItemCount(cid, 6500) >= 10 then
       doPlayerRemoveItem(cid, 6500, 10) -- remove items
       doPlayerAddItem(cid, 2160, 1) -- give reward
       selfSay("Wonderful, wonderful! Bring me more, (heheh), more okay friend? (trundles away with the newfound treasures.)", cid) -- advise player of something
       talkState[talkUser] = 0 -- remove talkstate
       npcHandler:releaseFocus(cid) -- not necessary but sometimes good to tie into a storyline
     else
       -- tell player they are stupid ,.. errm, That they don't have enough items
       selfSay("A great jester you are! You did not bring enough demonic essence.", cid)
       talkState[talkUser] = 0
     end
   -- if player says something other then yes during 'quest' then say this.
   elseif msgcontains(msg, "") and talkState[talkUser] >= 1 then
     selfSay("Ah.. Not a good jester are you, friend?", cid)
     talkState[talkUser] = 0
   
   -- Because sometimes you just want to test from the start
   --[[
   elseif msgcontains(msg, "reset") then
     selfSay("Reset.", cid)
     setPlayerStorageValue(cid, 45001, -1)
     talkState[talkUser] = 0
   ]]
   
   -- if player says something npc is not scripted for
   else
     selfSay("Hmm? I wasn't listening.", cid)
     talkState[talkUser] = 0 
   end
 
   return true
end

npcHandler:setCallback(CALLBACK_GREET, greet)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

-- Edit 3

As promised.

data/npc/scripts/test.lua

Code:
--[[
__.....__.._______...__....__.._______...___.....__..._______..
\.\..././.|__...__|.|..|.././.|__...__|.|...\...|..|.|__...__|.
.\.\././.....|.|....|..|././.....|.|....|....\..|..|....|.|....
..\.../......|.|....|..|/./......|.|....|..|\.\.|..|....|.|....
../...\......|.|....|.....\......|.|....|..|.\.\|..|....|.|....
././.\.\...__|.|....|..|\..\...__|.|....|..|..\....|..__|.|....
/_/...\_\.|_______|.|__| \__\.|_______|.|__|...\___|.|_______|.

https://otland.net/threads/xikinis-free-scripting-service-0-3-7-0-3-6-0-4.234306/page-8#post-2291088

]]--

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
msgcontains = doMessageCheck -- I beleive I added this at some point because of an issue I was having. If it causes you issues, just remove it.

function onCreatureAppear(cid)  npcHandler:onCreatureAppear(cid)  end
function onCreatureDisappear(cid)  npcHandler:onCreatureDisappear(cid)  end
function onCreatureSay(cid, type, msg)  npcHandler:onCreatureSay(cid, type, msg)  end
function onThink()  npcHandler:onThink()  end

function greet(cid)     talkState[cid] = 0     return true   end
function getNpcName()     return getCreatureName(getNpcId())   end

---- Start Config -----
local c = {
   questStorage = 45001,
   giveItem = 6500,
   giveItemAmount = 10,
   giveItemName = "demonic essence",
   rewardItem = 2160, -- crystal coin
   rewardItemAmount = 1,
   startQuest = "Bring 10 demonic essence and I'll give you 1 crystal coin. Okay? Okay.",
   continueQuest = "Have you brought the demonic essence?",
   rewardQuest = "Wonderful, wonderful! Bring me more, (heheh), more okay friend? (trundles away with the newfound treasures.)",
   notEnoughItems = "A great jester you are! You did not bring enough demonic essence.",
   continueQuestCancel = "Ah.. Not a good jester are you, friend?",
   notScriptedYet = "Hmm? I wasn't listening."
}
---- End Config -------

function creatureSayCallback(cid, type, msg)
  if(not npcHandler:isFocused(cid)) then
     return false
  end
  
   local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
  
  
   if msgcontains(msg, "job") then
     selfSay("My job is to show the world how fashionable they can be!", cid)
     talkState[talkUser] = 0
   elseif msgcontains(msg, "name") then
     selfSay("My name is " .. getNpcName() .. ".", cid)
     talkState[talkUser] = 0
  
   elseif msgcontains(msg, c.giveItemName) and getPlayerStorageValue(cid, c.questStorage) < 1 then
     selfSay(""..c.startQuest.."", cid)
     setPlayerStorageValue(cid, c.questStorage, 1)
     talkState[talkUser] = 0

   elseif msgcontains(msg, c.giveItemName) and getPlayerStorageValue(cid, c.questStorage) == 1 then
     selfSay(""..c.continueQuest.."", cid)
     talkState[talkUser] = 1
   elseif msgcontains(msg, "yes") and talkState[talkUser] == 1 then
     if getPlayerItemCount(cid, c.giveItem) >= c.giveItemAmount then
       doPlayerRemoveItem(cid, c.giveItem, c.giveItemAmount)
       doPlayerAddItem(cid, c.rewardItem, c.rewardItemAmount)
       selfSay(""..c.rewardQuest.."", cid)
       talkState[talkUser] = 0
       npcHandler:releaseFocus(cid)
     else
       selfSay(""..c.notEnoughItems.."", cid)
       talkState[talkUser] = 0
     end
   elseif msgcontains(msg, "") and talkState[talkUser] >= 1 then
     selfSay(""..c.continueQuestCancel.."", cid)
     talkState[talkUser] = 0
    
   --[[
   elseif msgcontains(msg, "reset") then
     selfSay("Reset.", cid)
     setPlayerStorageValue(cid, c.questStorage, -1)
     talkState[talkUser] = 0
   ]]
    
   else
     selfSay(""..c.notScriptedYet.."", cid)
     talkState[talkUser] = 0  
   end
  
   return true
end

npcHandler:setCallback(CALLBACK_GREET, greet)
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
 
Last edited:
Rofl.

I've looked and researched, I cannot find any command that allows you to enable or disable Party Share.
I could possibly make a script that gives everyone in the killers party experience.. but then they would be able to have shared experience as well as the script's experience.. so it doesn't seem beneficial really.
Also, since there's no command to getCreatureExperience.. only getPlayerExperience You'd have to add in all the values of the creatures experience manually for your server (all into a table).. which would not scale with config.lua or bonus experience from any other means. (Experience tokens/1.5 happy hours/experience scroll/double exp for being premium) et cetera..
All in all, I don't think this is what you are looking for, and I don't see many people using it.. or taking the time too use it.
(Not to mention it would take forever to script in the first place.. =[ )
Anyways, if you can think of another script / way for me to script this to fit your original / new idea then please tell me.


Works for Crying_Damson 0.3.7. Cannot verify if it works for other versions.
Also a quirk.. for some reason the npc will always face south. -shrugs-
The guard checks the area once per second (servers default check-time.. that can be modified to be more then 1 second but not less.)..
So if a player can run past the 'detection zone' in less then 1 second.. they can technically by-pass the npc.
Just a heads up.

Change file names to whatever you like.

data/npc/Guard_Check_for_Player.xml

Code:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="Guard Check for Player" script="data/npc/scripts/guard_check_for_player.lua" walkinterval="0" floorchange="0">
   <health now="100" max="100"/>
   <look type="139" head="116" body="116" legs="116" feet="97" addons="3"/>
</npc>
data/npc/scripts/guard_check_for_player.lua
Code:
--[[
__.....__.._______...__....__.._______...___.....__..._______..
\.\..././.|__...__|.|..|.././.|__...__|.|...\...|..|.|__...__|.
.\.\././.....|.|....|..|././.....|.|....|....\..|..|....|.|....
..\.../......|.|....|..|/./......|.|....|..|\.\.|..|....|.|....
../...\......|.|....|.....\......|.|....|..|.\.\|..|....|.|....
././.\.\...__|.|....|..|\..\...__|.|....|..|..\....|..__|.|....
/_/...\_\.|_______|.|__| \__\.|_______|.|__|...\___|.|_______|.

https://otland.net/threads/xikinis-free-scripting-service-0-3-7-0-3-6-0-4.234306/page-8#post-2290674

]]--

local c = {
   radiusx = 2, -- how far the guard checks left/right
   radiusy = 2, -- how far the guard checks up/down
   tpPos = {x = 1398, y = 1416, z = 7}, -- where you teleport to
   guardPos = {x = 1404, y = 1416, z = 7}, -- Where guard is located (for throw animation)
   effect = 8, -- what effect you want to use. (can use any throw animation. example: 8, OR, CONST_ANI_THROWINGKNIFE )
   guardSay = 'Hey you! Stop right there! You have no business here!', -- What guard says when you get near.
   damage = 50 -- don't add a comma.. How much npc hits player (will bring hp down to 1 at max.)
}
------------------end of config------------------

-- Check for players
function getCreaturesfromArea(pos, radiusx, radiusy, stack)
   local creatures = { }
   local starting = {x = (pos.x - c.radiusx), y = (pos.y - c.radiusy), z = pos.z, stackpos = stack}
   local ending = {x = (pos.x + c.radiusx), y = (pos.y + c.radiusy), z = pos.z, stackpos = stack}
   local checking = {x = starting.x, y = starting.y, z = starting.z, stackpos = starting.stackpos}
   repeat
     creature = getThingfromPos(checking)
     if isPlayer(creature.uid) == TRUE then
       table.insert(creatures, creature.uid)
     end
     if checking.x == pos.x - 1 and checking.y == pos.y then
       checking.x = checking.x + 2
     else
       checking.x = checking.x + 1
     end
     if checking.x > ending.x then
       checking.x = starting.x
       checking.y = checking.y + 1
     end
   until checking.y > ending.y
   return creatures
end
-- Start check for players, and initiate teleport
function onThink()
   creature_table = getCreaturesfromArea(getCreaturePosition(getNpcCid(  )), radiusx, radiusy, 253)
   if #creature_table >= 1 then
     selfSay(''.. c.guardSay ..'')
     for i = 1, #creature_table do
       doTeleportThing(creature_table[i], c.tpPos, true)
       doSendDistanceShoot(c.guardPos, c.tpPos, c.effect)
       if getCreatureHealth(creature_table[i]) <= (c.damage) then
         health = getCreatureHealth(creature_table[i]) - 1
         doCreatureAddHealth(creature_table[i], - health)
       else
         doCreatureAddHealth(creature_table[i], - c.damage)
       end
     end
   end
end

when im starting up the server im getting this error spamming xd
error.png
 
I get the same error if there are empty squares near the npc.
baR6Nzo.png

Just make sure there is map everywhere and the error won't appear.

i see well i changed the position and its fine now just changed the distance of looking! ty and also the looking to the south is np for me :p for some reason all my npc's act that way
 
At long last. :p @Codex NG @LordVissie

anwB325.png


I did a few test runs, and it worked every time, without fail.

I was going to make a fancy global script and such to prevent griefing.. due to server reset's and such..
but I thought that is too complicated.. and causes unnecessary strain on the server.
Instead I made the initial lever check all of that when used.

Generally.. this is how the positions look.

Q6iSLBU.png


General usage:

[1] Use lever, get teleport to arena
[2] Kill joke/start monster.
[3] Kill wave 1
[4] Kill wave 2/3/4/5/6/7 et cetera.. (however many you add.)
[5] Kill final wave, get teleport to reward area.

If your still inside when lever reset's, another player can start the arena, and kick you out.

On to the scripts + installation.
[Note: Thanks to @Alucar we now have a 'as many people as you want in arena' script here.]

Create an Arena.
Create a Lever area.
Create a Reward area.

Quick notes;
Global Storage is required to be the same in both scripts.
Make sure monster names and filenames are the same to avoid confusion.

Place lever with an actionID on map.
data/actions/actions.xml
Code:
<action actionid="1111111" event="script" value="Arena_Lever.lua"/>
data/actions/scripts/Arena_Lever.lua

Code:
---------------------------------- Start Config -------------------------------

local config = {
   arena_position = {x = 111111, y = 111111, z = 111}, -- Player Arena Position
   failed_position = {x = 111111, y = 111111, z = 111}, -- Player took too long position
   lever_reset_time = 15, -- in minutes (how long until another player can kick them out)
   global_storage = 1111111, -- any free storage
   top_left_corner = {x = 111111, y = 111111, z = 111}, -- top left corner of arena
   bottom_right_corner = {x = 111111, y = 111111, z = 111}, -- bottom right corner of arena
   joke_monster = "rat" -- They will kill this monster to start the waves
}

----------------------------------- End Config --------------------------------

local function reset(p)
   doTransformItem(getTileItemById(p, 1946).uid, 1945)
end

local function teleport(cid)
   doTeleportThing(cid, config.arena_position)
   doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "---------------------------------------")
   doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Kill the creature to start Wave 1.")
   doCreateMonster(config.joke_monster, config.arena_position)
end

function onUse(cid, item, fromPosition, itemEx, toPosition)

   -- check if lever is currently used
   if item.itemid == 1946 then
     return doPlayerSendTextMessage(cid, 22, "Wait for switch to reset. It resets automatically every ".. config.lever_reset_time .." minutes.")
   end

   -- check for players/monsters in arena, and kick them out/remove them
   for t = config.top_left_corner.x, config.bottom_right_corner.x do
     for f = config.top_left_corner.y, config.bottom_right_corner.y do
       pos = {x = t, y = f, z = 7}
       pid = getTopCreature(pos).uid
       if isPlayer(pid) then
         doTeleportThing(pid, config.failed_position)
         doPlayerSendTextMessage(pid, MESSAGE_STATUS_CONSOLE_BLUE, "Another player started the arena. You have been removed. Better luck next time!")
       end
       if isMonster(pid) then
         doRemoveCreature(pid)
       end
     end
   end

   -- tell player what to do
   doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Lever resets automatically every ".. config.lever_reset_time .." minutes.")
   doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Once the lever resets another player can start the arena.")
   doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "If your still inside when another player starts, you will be removed from the arena and unable to continue.")

   -- reset global storage
   setGlobalStorageValue(global_storage, 0)

   -- teleport player to arena, send start message, create start/joke monster
   addEvent(teleport, 5000, cid)

   -- transform lever, and add reset
   doTransformItem(item.uid, item.itemid + 1)
   addEvent(reset, ((config.lever_reset_time * 60 * 1000) + 5000), toPosition)

   return true
end
 
Last edited:
data/creaturescripts/creaturescripts.xml
Code:
<event type="kill" name="Arena_Death" event="script" value="Arena_Death.lua"/>
data/creaturescripts/scripts/login.lua [somewhere near the bottom with the other registered events]
Code:
registerCreatureEvent(cid, "Arena_Death")
You can add more monsters to the waves, but you will need to also adjust the counters further in the script.
Generally the joke/start monster will count for 1, then you simply add how many monsters are in the tables.
(Currently have 4 per wave, so..)
(Joke monster + amount in wave = next number)
(1+4 = 5 (this will start 2nd wave.))

(5+4 = 9 (this will start 3rd wave.))

(9+4 = 13(this is currently the final round, so this will teleport player to reward_area)
Again, simply adjust it to fit your needs.

data/creaturescripts/scripts/Arena_Death.lua
Code:
local config = {
   reward_position = {x = 111111, y = 111111, z = 111}, -- Teleport location when Arena is Cleared.
   global_storage = 1111111, -- any free storage
   top_left_corner = {x = 111111, y = 111111, z = 111}, -- top left corner of arena
   bottom_right_corner = {x = 111111, y = 111111, z = 111} -- bottom right corner of arena
}

local monsters = { -- All monsters in arena (including joke monster)
   [1] = "rat",
   [2] = "cave rat",
   [3] = "spider",
   [4] = "snake",
   [5] = "bug"
}

local monster_config_wave_one = { -- wave 1
   [1] = {position = {x = 111111, y = 111111, z = 111}, name = "cave rat"},
   [2] = {position = {x = 111111, y = 111111, z = 111}, name = "spider"},
   [3] = {position = {x = 111111, y = 111111, z = 111}, name = "snake"},
   [4] = {position = {x = 111111, y = 111111, z = 111}, name = "bug"}
}

local monster_config_wave_two = { -- wave 2
   [1] = {position = {x = 111111, y = 111111, z = 111}, name = "cave rat"},
   [2] = {position = {x = 111111, y = 111111, z = 111}, name = "spider"},
   [3] = {position = {x = 111111, y = 111111, z = 111}, name = "snake"},
   [4] = {position = {x = 111111, y = 111111, z = 111}, name = "bug"}
}

local monster_config_wave_three = { -- wave 3
   [1] = {position = {x = 111111, y = 111111, z = 111}, name = "cave rat"},
   [2] = {position = {x = 111111, y = 111111, z = 111}, name = "spider"},
   [3] = {position = {x = 111111, y = 111111, z = 111}, name = "snake"},
   [4] = {position = {x = 111111, y = 111111, z = 111}, name = "bug"}
}

function onKill(cid, target, damage, flags)
   -- check if target is player
   if isPlayer(target) then
     return true
   end
  
   -- check if target is on list of monsters in arena
   local name = getCreatureName(target):lower()
   count = 0
   for i = 1, #monsters do
     if name == monsters[i]:lower() then
       count = count + 1
     end
   end
   if count == 0 then -- if target is not on list
     return true
   end
  
   -- check if target is in area and add to global storage if it is
   for t = config.top_left_corner.x, config.bottom_right_corner.x do
     for f = config.top_left_corner.y, config.bottom_right_corner.y do
       pos = {x = t, y = f, z = 7}
       pid = getTopCreature(pos).uid
       if pid == target then
         setGlobalStorageValue(global_storage, getGlobalStorageValue(global_storage) + 1)
       end
     end
   end
  
   -- Start checks for waves of arena
  
   -- Wave 1
   if getGlobalStorageValue(global_storage) == 1 then
     for i = 1, #monster_config_wave_one do
       doCreateMonster(monster_config_wave_one[i].name, monster_config_wave_one[i].position)
     end
     doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wave 1.")
   end
  
   -- Wave 2
   if getGlobalStorageValue(global_storage) == 5 then
     for i = 1, #monster_config_wave_two do
       doCreateMonster(monster_config_wave_two[i].name, monster_config_wave_two[i].position)
     end
     doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wave 2.")
   end
  
   -- Wave 3
   if getGlobalStorageValue(global_storage) == 9 then
     for i = 1, #monster_config_wave_three do
       doCreateMonster(monster_config_wave_three[i].name, monster_config_wave_three[i].position)
     end
     doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Wave 3. Final Wave.")
   end
  
   -- When final wave ends
  
   -- Teleport player
   if getGlobalStorageValue(global_storage) == 13 then
     doTeleportThing(cid, config.reward_position)
     doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Congratulations! Go collect your reward.")
     setGlobalStorageValue(global_storage, 0)
   end
  
   return true
end
Cheers,

Xikini
 
Last edited:
I would never! :rolleyes:
I was going to make the lever script also summon the first wave.. but from personal experience,
there is usually lag deaths caused from teleporting + summoning monsters, and also..
It would've made it more confusing looking at the wave progression.
But meh.
 
Status
Not open for further replies.
Back
Top