Lua based map objects, help! (BW related)
Author |
Message |
411570N3
Joined: Wed Jan 07, 2009 10:26 am Posts: 4074 Location: That quaint little British colony down south
|
Re: Lua based map objects, help! (BW related)
Does it work with anything or just actors? It'd be interesting to stand next to one firing so as to accelerate your bullets...
|
Mon Apr 20, 2009 1:09 pm |
|
|
numgun
Joined: Sat Jan 13, 2007 11:04 pm Posts: 2932
|
Re: Lua based map objects, help! (BW related)
No I dont think it will affect MOPixels, but it should throw guns and other items like actors.
Im just thinking is a teleporter even possible if an object cant access another. Can it atleast check if there are objects that are the same as the teleporter?
|
Mon Apr 20, 2009 1:14 pm |
|
|
numgun
Joined: Sat Jan 13, 2007 11:04 pm Posts: 2932
|
Re: Lua based map objects, help! (BW related)
piipu wrote: Teleport: Code: for actor in MovableMan.Actors do if SceneMan.Scene:WithinArea("ATeleportArea" , actor.Pos) then local area = SceneMan.Scene:GetArea(self.ListOfTeleports[math.random(#self.ListOfTeleports)]) // insert code for 3 seconds delay here for actor2 in MovableMan.Actors do if SceneMan.Scene:WithinArea(area.Name , actor2.Pos) then // area.Name is just a guess at what would the area's name variable be. Just a plain area might do too. actor2:GibThis() end end actor.Pos = Vector( area:GetRandomPoint().X , area:GetRandomPoint().Y) //possibly a non-random way of doing this is possible end end
This requires a line around the start of the .lua: Code: self.ListOfTeleports = {"Area1" , "Area2" , ...} You also have to check all different areas to see if someone is in them. This is a very good method, but its tied to scene pre-placed and pre-defined areas. Is there a way that this code could be converted to use MOSR objects as the areas? And how do I do a 3 second delay with a boolean to check is there an actor inside the teleporter? : /
|
Mon Apr 20, 2009 1:50 pm |
|
|
piipu
Joined: Mon Jun 30, 2008 9:13 pm Posts: 499 Location: Finland
|
Re: Lua based map objects, help! (BW related)
Code: function Update(self) for actor in MovableMan.actors do if (actor.Pos.X >= Teleporter.Pos.X - self.distance) and (Teleporter.Pos.X <= Teleporter.Pos.X + self.distance) and (actor.Pos.Y >= Teleporter.Pos.Y - self.distance) and (actor.Pos.Y <= Teleporter.Pos.Y + self.distance) then // set self.distance to some nice value beforehand if not(Teleporter.activated == 1) then Teleporter.Timer = Timer() Teleporter.Timer:Reset(); Teleporter.activated = 1 else if Teleporter.Timer:IsPastSimMS(3000) then if [copypaste the first if statement here to see if the actor has stepped out of the area] then for actor2 in MovableMan.Actors do if [insert long if thingy here, replace actor with actor2] then actor2:GibThis() end end Teleporter.activated = 0 end end end end end
I think you can modify that to make it work. edit: added a check to see that the actor hasn't stepped out. Problems I can think of: Actor doesn't have to be in the teleporter for the 3 seconds, just the ending and start. If there are more actors in the teleporter, they will all be teleported. This may not be a problem. Teleporter.Timer may not work. You could change it to self.Timer, but then the whole network would activate and reset at once. editedit: added some more. This is getting messy.
Last edited by piipu on Mon Apr 20, 2009 2:35 pm, edited 1 time in total.
|
Mon Apr 20, 2009 2:20 pm |
|
|
numgun
Joined: Sat Jan 13, 2007 11:04 pm Posts: 2932
|
Re: Lua based map objects, help! (BW related)
Code: //do that stuff in the other post What do I do here? : S Which post are you talking about? LordTim's or yours? piipu wrote: Code: // set self.distance to some nice value beforehand What is this for? : 0 Code: if [copypaste the first if statement here to see if the actor has stepped out of the area] then
Buh? What statement? = I
Last edited by numgun on Mon Apr 20, 2009 2:37 pm, edited 1 time in total.
|
Mon Apr 20, 2009 2:31 pm |
|
|
piipu
Joined: Mon Jun 30, 2008 9:13 pm Posts: 499 Location: Finland
|
Re: Lua based map objects, help! (BW related)
Fixed that.
|
Mon Apr 20, 2009 2:36 pm |
|
|
numgun
Joined: Sat Jan 13, 2007 11:04 pm Posts: 2932
|
Re: Lua based map objects, help! (BW related)
Gah my head is going to explode. ;_; I barely understand anything from the code. *Bangs head against wall* Someone help! EDIT: Am I doing this right? : O Code: function Create(self) self.distance = 10 end
function Destroy(self)
end
function Update(self) for actor in MovableMan.actors do if (actor.Pos.X >= Teleporter.Pos.X - self.distance) and (Teleporter.Pos.X <= Teleporter.Pos.X + self.distance) and (actor.Pos.Y >= Teleporter.Pos.Y - self.distance) and (actor.Pos.Y <= Teleporter.Pos.Y + self.distance) then if not(Teleporter.activated == 1) then Teleporter.Timer = Timer() Teleporter.Timer:Reset(); Teleporter.activated = 1 else if Teleporter.Timer:IsPastSimMS(3000) then if (actor.Pos.X >= Teleporter.Pos.X - self.distance) and (Teleporter.Pos.X <= Teleporter.Pos.X + self.distance) and (actor.Pos.Y >= Teleporter.Pos.Y - self.distance) and (actor.Pos.Y <= Teleporter.Pos.Y + self.distance) then for actor2 in MovableMan.Actors do if (actor.Pos.X >= Teleporter.Pos.X - self.distance) and (Teleporter.Pos.X <= Teleporter.Pos.X + self.distance) and (actor.Pos.Y >= Teleporter.Pos.Y - self.distance) and (actor.Pos.Y <= Teleporter.Pos.Y + self.distance) then actor2:GibThis() end end Teleporter.activated = 0 end end end end end EDIT2: dont know if its revelant, but heres what the object the Lua code is tied to: Code: AddActor = MOSRotating PresetName = Teleporter Node
|
Mon Apr 20, 2009 2:41 pm |
|
|
piipu
Joined: Mon Jun 30, 2008 9:13 pm Posts: 499 Location: Finland
|
Re: Lua based map objects, help! (BW related)
Code: function Update(self) for actor in MovableMan.actors do if (actor.Pos.X >= Teleporter.Pos.X - self.distance) and (Teleporter.Pos.X <= Teleporter.Pos.X + self.distance) and (actor.Pos.Y >= Teleporter.Pos.Y - self.distance) and (actor.Pos.Y <= Teleporter.Pos.Y + self.distance) then // This checks if any actor is within a square the size of self.distance of the teleporter. if not(Teleporter.activated == 1) then // see if teleporter is activated Teleporter.Timer = Timer() // if not, set a timer for the teleporter, reset it just to Teleporter.Timer:Reset(); // be sure and set the teleporter activated Teleporter.activated = 1 else // if it is activated, wait until the timer has been on for 3 seconds, then check if the actor is if Teleporter.Timer:IsPastSimMS(3000) then //still in the teleporter. if [copypaste the first if statement here to see if the actor has stepped out of the area] then Teleporter2 = //whoops, there's a hole here! maybe LordTim can help with this. // if the actor is still in the area, select a random teleporter to be the target. for actor2 in MovableMan.Actors do // go through all actors on the map, see if anyone is inside the target. if [insert long if thingy here, replace actor with actor2 and Teleporter with Teleporter2] then actor2:GibThis() // if there's anyone in the target teleporter, gib them. end end Teleporter.activated = 0 // deactivate the teleporter so the delay will happen again. end end end end end
That should clear it up some. This method needs some way of setting Teleporter2 as a random teleporter on the scene, but I can't think of a way right now. Maybe LordTim knows. edit: this way, your actor will get gibbed if you end up in the same teleport you started from.
|
Mon Apr 20, 2009 2:54 pm |
|
|
numgun
Joined: Sat Jan 13, 2007 11:04 pm Posts: 2932
|
Re: Lua based map objects, help! (BW related)
After some copy pasta and elaborate thinking, I came up with this: Code: function Create(self) if(! _teleporters) then --ERROR HERE, UNEXPECTED SYMBOL AFTER ! _teleporters = {self} else table.insert(_teleporters,self) end self.teledelaytimer = Timer(); self.teleactivate = nil; end
function Destroy(self) table.remove(_teleporters,self) end
function Update(self) if(#_teleporters > 1) then for actor in MovableMan.Actors do if (actor.Pos.X >= self.Pos.X - 24) and (actor.Pos.X <= self.Pos.X + 24) and (actor.Pos.Y >= self.Pos.Y - 25) and (actor.Pos.Y <= self.Pos.Y + 25) and (actor.PinStrength <= 0) then // This checks if any actor is within a square the size of self.distance of the teleporter.
if MovableMan:IsParticle(self.teleactivate) == false then self.teleactivate = CreateAEmitter("Teleport Activation"); self.teleactivate:EnableEmission(true); self.teleactivate.Pos = Vector(0,0); MovableMan:AddParticle(self.teleactivate); end if self.teledelaytimer:LeftTillSimMS(3000) > 0 then self:AddObjectivePoint("Teleporting: " .. math.ceil(self.teleactivate:LeftTillSimMS(3000)/1000) .. " sec", Vector(0, 0), GameActivity.ARROWDOWN); --Removed "Activity.TEAM_1," from here. end if -self.teledelaytimer:LeftTillSimMS(0) > 3000 then --TELEPORTATION HAPPENS HERE for i,j in ipairs(_teleporters) do if(j == self) then if(_teleporters[j+1] == nil) actor.Pos = _teleporters[0].Pos else actor.Pos = _teleporters[j+1].Pos end end end end else self.teledelaytimer:Reset(); if MovableMan:IsParticle(self.teleactivate) then self.teleactivate.Lifetime = 1; end end Contains part of code from LordTim's code, but it has an error on line 2 and it says "UNEXPECTED SYMBOL AFTER "!"". Whats wrong with that? And how would I incorporate telefragging with this?
|
Mon Apr 20, 2009 8:16 pm |
|
|
piipu
Joined: Mon Jun 30, 2008 9:13 pm Posts: 499 Location: Finland
|
Re: Lua based map objects, help! (BW related)
Thats an intresting method Anyway, that error line should maybe be Code: if not(_teleporters) then Not sure about that tho'. Telefrag: Code: for i,j in ipairs(_teleporters) do if(j == self) then if(_teleporters[j+1] == nil) for actor2 in MovableMan.Actors do if ((actor2.Pos.X >= _teleporters[0].Pos.X - 24) and (actor2.Pos.X <= _teleporters[0].Pos.X + 24) and (actor2.Pos.Y >= _teleporters[0].Pos.Y - 25) and (actor2.Pos.Y <= _teleporters[0].Pos.Y + 25) then actor2:GibThis(); end end actor.Pos = _teleporters[0].Pos else for actor2 in MovableMan.Actors do if ((actor2.Pos.X >= _teleporters[j+1].Pos.X - 24) and (actor2.Pos.X <= _teleporters[j+1].Pos.X + 24) and (actor2.Pos.Y >= _teleporters[j+1].Pos.Y - 25) and (actor2.Pos.Y <= _teleporters[j+1].Pos.Y + 25) then actor2:GibThis(); end end actor.Pos = _teleporters[j+1].Pos end end end
edit: fixed wrong teleporter from telefragging edit2: Looking at LordTim's post, it's Code: if (!_teleporters) then without the space. Try that too. I have no idea about table syntax.
|
Mon Apr 20, 2009 9:03 pm |
|
|
numgun
Joined: Sat Jan 13, 2007 11:04 pm Posts: 2932
|
Re: Lua based map objects, help! (BW related)
Heres an updated code. It gives no errors, but it doesnt work either. Nothing happens when I get an actor inside a teleporter. : / Wierd stuff. I added the telefrag you made anyways. Code: function Create(self) if not(_teleporters) then --I think that not must be inside the brackets, not sure : S _teleporters = {self} else table.insert(_teleporters,self) end self.teledelaytimer = Timer(); self.teleactivate = nil; end
function Destroy(self) table.remove(_teleporters,self) end
function Update(self) if(#_teleporters > 1) then for actor in MovableMan.Actors do if (actor.Pos.X >= self.Pos.X - 24) and (actor.Pos.X <= self.Pos.X + 24) and (actor.Pos.Y >= self.Pos.Y - 25) and (actor.Pos.Y <= self.Pos.Y + 25) and (actor.PinStrength <= 0) then
if MovableMan:IsParticle(self.teleactivate) == false then self.teleactivate = CreateAEmitter("Teleport Activation"); self.teleactivate:EnableEmission(true); self.teleactivate.Pos = Vector(0,0); MovableMan:AddParticle(self.teleactivate); end --if self.teledelaytimer:LeftTillSimMS(3000) > 0 then --self:AddObjectivePoint("Teleporting: " .. math.ceil(self.teleactivate:LeftTillSimMS(3000)/1000) .. " sec", Vector(0, 0), GameActivity.ARROWDOWN); --Removed "Activity.TEAM_1," from here. --end if -self.teledelaytimer:LeftTillSimMS(0) > 3000 then --TELEPORTATION HAPPENS HERE for i,j in ipairs(_teleporters) do if(j == self) then if(_teleporters[j+1] == nil) for actor2 in MovableMan.Actors do if ((actor2.Pos.X >= _teleporters[0].Pos.X - 24) and (actor2.Pos.X <= _teleporters[0].Pos.X + 24) and (actor2.Pos.Y >= _teleporters[0].Pos.Y - 25) and (actor2.Pos.Y <= _teleporters[0].Pos.Y + 25) then actor2:GibThis(); end end actor.Pos = _teleporters[0].Pos else for actor2 in MovableMan.Actors do if ((actor2.Pos.X >= _teleporters[j+1].Pos.X - 24) and (actor2.Pos.X <= _teleporters[j+1].Pos.X + 24) and (actor2.Pos.Y >= _teleporters[j+1].Pos.Y - 25) and (actor2.Pos.Y <= _teleporters[j+1].Pos.Y + 25) then actor2:GibThis(); end end actor.Pos = _teleporters[j+1].Pos end end end end else self.teledelaytimer:Reset(); if MovableMan:IsParticle(self.teleactivate) then self.teleactivate.Lifetime = 1; end end end end end
|
Mon Apr 20, 2009 9:13 pm |
|
|
piipu
Joined: Mon Jun 30, 2008 9:13 pm Posts: 499 Location: Finland
|
Re: Lua based map objects, help! (BW related)
See if console gives any errors during playing. And try that Code: if (!_teleporters) then stuff
|
Mon Apr 20, 2009 9:35 pm |
|
|
numgun
Joined: Sat Jan 13, 2007 11:04 pm Posts: 2932
|
Re: Lua based map objects, help! (BW related)
Your telefrag code had some extra "(" symbols at some parts that caused errors. Now I dont know if this is even right, but I re-did the "not" part on line 2. Heres the latest code, now with no special effects and much more simple. No errors, but teleporters dont work. Code: function Create(self) _teleporters = 0 if (_teleporters == 0) then _teleporters = {self} else table.insert(_teleporters,self) end end
function Destroy(self) table.remove(_teleporters,self) end
function Update(self) if(#_teleporters > 1) then for actor in MovableMan.Actors do if (actor.Pos.X >= self.Pos.X - 24) and (actor.Pos.X <= self.Pos.X + 24) and (actor.Pos.Y >= self.Pos.Y - 25) and (actor.Pos.Y <= self.Pos.Y + 25) and (actor.PinStrength <= 0) then for i,j in ipairs(_teleporters) do if(j == self) then if(_teleporters[j+1] == nil) then for actor2 in MovableMan.Actors do if (actor2.Pos.X >= _teleporters[0].Pos.X - 24) and (actor2.Pos.X <= _teleporters[0].Pos.X + 24) and (actor2.Pos.Y >= _teleporters[0].Pos.Y - 25) and (actor2.Pos.Y <= _teleporters[0].Pos.Y + 25) then actor2:GibThis(); end end actor.Pos = _teleporters[0].Pos else for actor2 in MovableMan.Actors do if (actor2.Pos.X >= _teleporters[j+1].Pos.X - 24) and (actor2.Pos.X <= _teleporters[j+1].Pos.X + 24) and (actor2.Pos.Y >= _teleporters[j+1].Pos.Y - 25) and (actor2.Pos.Y <= _teleporters[j+1].Pos.Y + 25) then actor2:GibThis(); end end actor.Pos = _teleporters[j+1].Pos end end end end end end end
|
Mon Apr 20, 2009 9:52 pm |
|
|
Lord Tim
Joined: Fri Apr 27, 2007 4:55 pm Posts: 1178 Location: America!
|
Re: Lua based map objects, help! (BW related)
Right, I should explain what I did. First of all, the code I wrote, I did directly into the browser, with no tests whatsoever. I forgot that Lua doesn't use "!". Instead you should be able to use either "not _teleporters" or "_teleporters == nil". Both should return true when the table has not yet been initialized. The "_teleporters" is designed to be a global table that will just be sitting in the Lua context. So every object with a Lua script will be able to access that table. Essentially, you don't want to be doing the _teleporters = 0 bit, because that will reset the table every time a new teleporter is added. The thing that could potentially happen if you haven't added the delay code is that instantly after teleporting your actor, it teleports him right back. You should notice this, though, since the actor won't be able to move anymore. There should always be at least two teleporters because of the check "if(#_teleporters > 1) then", where "#" is just the operator that gets the size of the table. The bit with Code: for i,j in ipairs(_teleporters) do if(j == self) then if(_teleporters[j+1] == nil) then --etc else --etc end is just going through the global list of teleporters one by one until it gets to the current teleporter. When it finds that, it attempts to teleport to the next one in that global list. If that one doesn't exist (your teleporter is at the end of the list), then it tries to teleport to the first one in the list, which I just realized will be at [1] instead of [0], because Lua arrays always start at 1, so that needs to be fixed too. I'll think about the timing bit and post later.
|
Tue Apr 21, 2009 2:11 am |
|
|
piipu
Joined: Mon Jun 30, 2008 9:13 pm Posts: 499 Location: Finland
|
Re: Lua based map objects, help! (BW related)
You could cut half the code off just by using _teleporter[math.rand(1,#_teleporter)] as the target. I'll see about that after school, I don't have time right now.
|
Tue Apr 21, 2009 6:56 am |
|
|
|
Who is online |
Users browsing this forum: No registered users |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|