Leo32
Getting back into it...
- Joined
- Sep 21, 2007
- Messages
- 990
- Solutions
- 14
- Reaction score
- 551
Hi Guys,
I've recently come back and have revived one of my old projects.
I'd like to gain some more knowledge around intelligent LUA structures and using intelligent IF gates.
For context-:
I have a script I wrote that functions well
(Needs to be tweaked for global exhaust to prevent multiple characters from triggering the chest spawn)
But even so, it's riddled with duplicated nested IFs because I'm not all that amazing at this.
Take a look at the code after -- Stone 1
What would be the best way to replace all the nested IFs?
Can someone point to to any good learning material on this sort of thing?
I could avoid the issue entirely by using storages for each current stone sequence, instead of getting the previous stone.itemid.
Doesn't really help with the learning though
I've recently come back and have revived one of my old projects.
I'd like to gain some more knowledge around intelligent LUA structures and using intelligent IF gates.
For context-:
I have a script I wrote that functions well
(Needs to be tweaked for global exhaust to prevent multiple characters from triggering the chest spawn)
But even so, it's riddled with duplicated nested IFs because I'm not all that amazing at this.
Take a look at the code after -- Stone 1
Code:
local exhaust = createConditionObject(CONDITION_EXHAUST)
setConditionParam(exhaust, CONDITION_PARAM_TICKS, 10000)
local chestpos = {x=1053, y=525, z=11}
local stone1pos = {x=1053, y=520, z=11}
local stone2pos = {x=1057, y=521, z=11}
local stone3pos = {x=1059, y=525, z=11}
local stone4pos = {x=1055, y=529, z=11}
local stone5pos = {x=1050, y=528, z=11}
local stone6pos = {x=1049, y=523, z=11}
function resetred(r)
doTransformItem(getTileItemById(r, 1355).uid, 1304)
return true
end
function resetblue(b)
doTransformItem(getTileItemById(b, 1354).uid, 1304)
return true
end
function destroychest()
doRemoveItem(getTileItemById(chestpos, 12664).uid,1)
doSendMagicEffect(chestpos, CONST_ME_POFF)
return true
end
function onUse(player, item, fromPosition, itemEx, toPosition)
if getCreatureCondition(player, CONDITION_EXHAUST) == TRUE then
local pos = player:getPosition()
pos:sendMagicEffect(CONST_ME_POFF)
player:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED))
return true
else
-- Stone 1
if (item.actionid == 2001) then
if not (getTileItemById(stone2pos, 1355).uid > 0) then
if not (getTileItemById(stone3pos, 1355).uid > 0) then
if not (getTileItemById(stone4pos, 1355).uid > 0) then
if not (getTileItemById(stone5pos, 1355).uid > 0) then
if not (getTileItemById(stone6pos, 1355).uid > 0) then
item:transform(1354)
addEvent(resetblue, 10000, toPosition)
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
-- Stone 2
elseif (item.actionid == 2002) then
if (getTileItemById(stone1pos, 1354).uid > 0) then
if not (getTileItemById(stone3pos, 1355).uid > 0) then
if not (getTileItemById(stone4pos, 1355).uid > 0) then
if not (getTileItemById(stone5pos, 1355).uid > 0) then
if not (getTileItemById(stone6pos, 1355).uid > 0) then
item:transform(1354)
addEvent(resetblue, 10000, toPosition)
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
-- Stone 4
elseif (item.actionid == 2004) then
if (getTileItemById(stone2pos, 1354).uid > 0) then
if not (getTileItemById(stone3pos, 1355).uid > 0) then
if not (getTileItemById(stone1pos, 1355).uid > 0) then
if not (getTileItemById(stone5pos, 1355).uid > 0) then
if not (getTileItemById(stone6pos, 1355).uid > 0) then
item:transform(1354)
addEvent(resetblue, 10000, toPosition)
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
-- Stone 6
elseif (item.actionid == 2006) then
if not (getTileItemById(stone2pos, 1355).uid > 0) then
if not (getTileItemById(stone3pos, 1355).uid > 0) then
if (getTileItemById(stone4pos, 1354).uid > 0) then
if not (getTileItemById(stone5pos, 1355).uid > 0) then
if not (getTileItemById(stone1pos, 1355).uid > 0) then
item:transform(1354)
addEvent(resetblue, 10000, toPosition)
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
-- Stone 5
elseif (item.actionid == 2005) then
if not (getTileItemById(stone2pos, 1355).uid > 0) then
if not (getTileItemById(stone3pos, 1355).uid > 0) then
if not (getTileItemById(stone4pos, 1355).uid > 0) then
if not (getTileItemById(stone1pos, 1355).uid > 0) then
if (getTileItemById(stone6pos, 1354).uid > 0) then
item:transform(1354)
addEvent(resetblue, 10000, toPosition)
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
-- Stone 3
elseif (item.actionid == 2003) then
if not (getTileItemById(stone2pos, 1355).uid > 0) then
if not (getTileItemById(stone1pos, 1355).uid > 0) then
if not (getTileItemById(stone4pos, 1355).uid > 0) then
if (getTileItemById(stone5pos, 1354).uid > 0) then
if not (getTileItemById(stone6pos, 1355).uid > 0) then
local pos = player:getPosition()
local chest = getTileItemById(chestpos, 12664)
local create = doCreateItem(12664,1,chestpos)
doSetItemActionId(create, 2010)
pos:sendMagicEffect(32)
doSummonCreature("Tarantula", stone1pos)
doSummonCreature("Tarantula", stone3pos)
doSummonCreature("Tarantula", stone6pos)
item:transform(1354)
addEvent(resetblue, 10000, toPosition)
addEvent(destroychest, 10000)
doAddCondition(player, exhaust)
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
else
item:transform(1355)
addEvent(resetred, 10000, toPosition)
doAddCondition(player, exhaust)
end
end
end
end
What would be the best way to replace all the nested IFs?
Can someone point to to any good learning material on this sort of thing?
I could avoid the issue entirely by using storages for each current stone sequence, instead of getting the previous stone.itemid.
Doesn't really help with the learning though
Last edited by a moderator: