• 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!

Action Snake system

Here is rewroted version with creating void tile and removing after lose. Ofcourse used mocks functions :)
LIB
PHP:
--[[
Script by Mock the bear
]]
SNAKE = {
	_VERSION="1.0 by mock",
	---Snake config
	itemid=1739,
	freeglobalstorage=28103,
	itemFood=6394,
	flyvoid=460,
	controlpos={x=943,y=957,z=6},
	exitpos = {x=942,y=949,z=7},
	centerpos={x=942,y=956,z=7},
	timer = function(cid,n,pos_,time)
		local pos_ = pos_ or {{SNAKE.centerpos}}
		setGlobalStorageValue(SNAKE.freeglobalstorage,cid)
		if not isPlayer(cid) then
			SNAKE.clean()
			return
		end
			for i,pos in pairs(pos_) do
				SNAKE.find_and_delete(pos[1])
				if i == 1 then
					pos[2] = SNAKE.copypos(pos[1])
					pos[1] = getPosByDir({x=pos[1].x,y=pos[1].y,z=pos[1].z,stackpos=255},getCreatureLookDir(cid))
				else
					pos[2] = SNAKE.copypos(pos[1])
					pos[1] = pos_[i-1][2]
				end
				local ret,p,walk = SNAKE.check(pos[1])
				if ret == 1 or ret == 3 then
					addEvent(doTeleportThing,1000,cid,SNAKE.exitpos)
					addEvent(doCreatureSay,1100,cid,'Points '..(#pos_-1)..'.')
					SNAKE.clean()
					SNAKE.deleteTile(SNAKE.controlpos)
					doRemoveItem(sqm.uid,1)
					setGlobalStorageValue(SNAKE.freeglobalstorage,0)
					return
				end
				if ret == 2 then
					doRemoveItem(p.uid,-1)
					if p.itemid == SNAKE.itemFood then
						pos_[#pos_+1] = {pos[2],pos[2]}
						for i=1,5 do
							addEvent(doSendMagicEffect,100*i,pos[1],29)
						end
						SNAKE.generateFood()
					end
				end
				doCreateItem(SNAKE.itemid,1,pos[1])
 
			end
			local plpos = getCreaturePosition(cid)
			local generated = {}
			for i=0,3 do
				generated[i] = getPosByDir({x=SNAKE.controlpos.x,y=SNAKE.controlpos.y,z=SNAKE.controlpos.z},i)
			end
			for i,pos in pairs(generated) do
				if SNAKE.samepos(plpos,pos) then
 
					doTeleportThing(cid,SNAKE.controlpos,false)
				end
				addEvent(doSendMagicEffect,100,pos,56,cid)
			end
		addEvent(SNAKE.timer,time,cid,n,pos_,time)
	end,
	copypos = function(p)
		return {x=p.x,y=p.y,z=p.z,stackpos=p.stackpos}
	end,
	samepos = function(p1,p2)
		if p1.x == p2.x and p2.y == p2.y then
			return true
		end
		return false
	end,
	generateFood = function()
		local pp = {x=SNAKE.centerpos.x+math.random(-6,6),y=SNAKE.centerpos.y+math.random(-4,4),z=SNAKE.centerpos.z}
		for i=1,5 do
			addEvent(doSendMagicEffect,100*i,pp,30)
		end
		doCreateItem(SNAKE.itemFood,1,pp)
	end,
	clean = function()
		for y=-4,4 do
			for x=-6,6 do
				local pp = {x=SNAKE.centerpos.x+x,y=SNAKE.centerpos.y+y,z=SNAKE.centerpos.z}
				for i=250,255 do
					pp.stackpos = i
					local p = getThingFromPos(pp)
					if p.itemid ~= 0 then
						doRemoveItem(p.uid,-1)
						doSendMagicEffect(pp,15)
					end
				end
			end
		end
	end,
	check = function(pos)
		for i=1,10 do
			pos.stackpos = i
			local p = getThingFromPos(pos)
			if p.itemid == SNAKE.itemid then
				return 1,p,true
			elseif not SNAKE.isWalkable(pos) then
				return 3,p,false
			elseif p.itemid ~= 0 then
				return 2,p
			end
		end
		return false
	end,
	find_and_delete = function(pos)
		for i=0,255 do
			pos.stackpos = 255-i
			local p = getThingFromPos(pos)
			if p.itemid == SNAKE.itemid then
				return doRemoveItem(p.uid,1)
			end
		end
	end,
	isWalkable = function(pos, creature, proj, pz)-- by Nord
		if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
		if getTopCreature(pos).uid > 0 and creature then return false end
		if getTileInfo(pos).protection and pz then return false, true end
		local n = not proj and 3 or 2
		for i = 0, 255 do
			pos.stackpos = i
			local tile = getTileThingByPos(pos)
			if tile.itemid ~= 0 and not isCreature(tile.uid) then
				if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
					return false
				end
			end
		end
		return true
	end,
	hasSqm = function(pos)-- by Mock
		return getTileThingByPos({x=pos.x,y=pos.y,z=pos.z,stackpos=0}).itemid ~= 0
	end,
	deleteTile = function(pos)-- Script by mock
		if SNAKE.hasSqm(pos) then
			local sqm = getSqmId(pos)
			if sqm.itemid == flyvoid then
				doRemoveItem(sqm.uid,1)
			end
		end
	end,
	doCreateTile = function(id,pos) -- Script by mock
		doAreaCombatHealth(0,0,pos,0,0,0,255)
		doCreateItem(id,1,pos)
	end,
}

ACTION
PHP:
function onUse(cid, item, frompos, item2, topos)
	if not isPlayer(getGlobalStorageValue(SNAKE.freeglobalstorage)) then
		SNAKE.doCreateTile(SNAKE.flyvoid,SNAKE.controlpos)
		doTeleportThing(cid,SNAKE.controlpos)
		SNAKE.timer(cid,1,nil,item.actionid == 0 and 500 or item.actionid)
		doPlayerSendTextMessage(cid,25,'Hold key CTRL and use the arrows to control snake.')
		SNAKE.generateFood()
	else
		doPlayerSendTextMessage(cid,25,'Please wait.')
	end
end
 
Well, it works but this error pops up every time somebody plays and I think it may be causing my server to crash.

Code:
[Error - Action Interface]
In a timer event called from:
data/actions/scripts/snakesys.lua:onUse
Description:
(luaDoRemoveItem) Item not found

[Error - Action Interface]
In a timer event called from:
data/actions/scripts/snakesys.lua:onUse
Description:
(luaDoRemoveItem) Item not found



I get same error and I am not teleported to middle of snake area and no voids pop up
 
when i right click the gems, it says like you cannot use this object, and the gems have their actual action ids :/

- - - Updated - - -

plz mock i have this error
Lua:
[27/12/2012 21:44:41] [Error - Action Interface] 
[27/12/2012 21:44:41] In a timer event called from: 
[27/12/2012 21:44:41] data/actions/scripts/snakesys.lua:onUse
[27/12/2012 21:44:41] Description: 
[27/12/2012 21:44:41] (luaDoRemoveItem) Item not found

while i'm playing :S, why is that?
 
Same here,the script works but when playing inside,I get the error:
Code:
[19/03/2013 20:24:00] [Error - Action Interface] 
[19/03/2013 20:24:00] In a timer event called from: 
[19/03/2013 20:24:00] data/actions/scripts/snakesys.lua:onUse
[19/03/2013 20:24:00] Description: 
[19/03/2013 20:24:00] (luaDoRemoveItem) Item not found
 
Help

[Error - Action Interface]
data/actions/scripts/snakesys.lua:eek:nUse
Description:
data/lib/snakesys.lua:68: attempt to index local 'p2' (a number value)
stack traceback:
data/lib/snakesys.lua:68: in function 'samepos'
data/lib/snakesys.lua:56: in function 'timer'
data/actions/scripts/snakesys.lua:4: in function <data/actions/scripts/snakesys.lua:1>
 
Help

[Error - Action Interface]
data/actions/scripts/snakesys.lua:eek:nUse
Description:
data/lib/snakesys.lua:68: attempt to index local 'p2' (a number value)
stack traceback:
data/lib/snakesys.lua:68: in function 'samepos'
data/lib/snakesys.lua:56: in function 'timer'
data/actions/scripts/snakesys.lua:4: in function <data/actions/scripts/snakesys.lua:1>
same problem please help
 
Works great, and it's very fun to play! Thanks :D

My only concern is that when the snake becomes larger it begins to lag the server. Any ideas on how to optimize the performance?
 
Change this line:
Code:
addEvent(SNAKE.timer,time,cid,n,pos_,time)
To:
Code:
addEvent(SNAKE.timer,300,cid,n,pos_,300)

Now you can adjust the speed: 1000 = 1 second, 500 = 0.5 seconds and so on and so forth.
 
than i try install snakesys on lib my zombie event mess up lol , any ideas why ? ;(
 
Back
Top