Data Realms Fan Forums http://45.55.195.193/ |
|
Script causes crashes when exiting/reloading http://45.55.195.193/viewtopic.php?f=73&t=19765 |
Page 1 of 1 |
Author: | Areku [ Sat Sep 18, 2010 12:00 am ] |
Post subject: | Script causes crashes when exiting/reloading |
So I made this neato pilotable vehicle script, which allows an actor to be piloted by other ones. It's pretty stable, and works exactly how I wanted it to. However. When the actor is being piloted, if the scene ends or is reloaded, the game will crash pretty much instantly. I've tried to avoid this with extra ActivityRunning() and self:IsPlayerControlled checks, but to no avail. So I'm asking ye, the lua-masters of DRL, if you would kindly help me. Here's the script: Code: function Create(self) self.IsPiloted = 0; self.Pilot = nil; self.DeathTimer = Timer(); self.timer = Timer(); self.SignTimer = Timer(); self.EffectTimer = Timer(); self.IsDying = 0; self.PilotPosY = SceneMan.SceneHeight; self.Placer = nil; for i = 1,MovableMan:GetMOIDCount()-1 do self.finder = MovableMan:GetMOFromID(i); if self.finder.PresetName == "Apollo Armor Suit Effect Placer" and self.finder.RootID == self.ID then self.Placer = ToAttachable(MovableMan:GetMOFromID(self.finder.ID)); print(("Found placer: ") .. (self.Placer.PresetName)); end end end function Update(self) if self.timer:IsPastSimMS(25) then if ActivityMan:ActivityRunning() then if self.IsPiloted == 0 then if self.SignTimer:IsPastSimMS(20) then local sign = CreateMOSParticle("No Pilot Sign"); sign.Pos = self.AboveHUDPos; MovableMan:AddParticle(sign); self.SignTimer:Reset(); end self:SetControllerMode(Controller.CIM_DISABLED, -1); if self:IsPlayerControlled() then ActivityMan:GetActivity():SwitchToActor(ActivityMan:GetActivity():GetPlayerBrain(self:GetController().Player),self:GetController().Player,self.Team); end for actor in MovableMan.Actors do if actor.ClassName == "AHuman" and actor.Mass < 300 then local avgx = actor.Pos.X - self.Pos.X; local avgy = actor.Pos.Y - self.Pos.Y; local dist = math.sqrt(avgx ^ 2 + avgy ^ 2); if dist < 50 then if actor:IsPlayerControlled() and actor:GetController():IsState(Controller.PIE_MENU_ACTIVE) and actor.AIMode == Actor.AIMODE_GOLDDIG then self.Pilot = actor; self.IsPiloted = 1; self:SetControllerMode(Controller.CIM_AI, -1); ActivityMan:GetActivity():SwitchToActor(self,actor:GetController().Player,self.Team); self:FlashWhite(1000); actor.HitsMOS = false; actor.GetsHitByMOS = false; actor.AIMode = Actor.AIMODE_SENTRY; actor:SetControllerMode(Controller.CIM_DISABLED, -1); self.HitsMOS = true; end end end end self.AIMode = Actor.AIMODE_SENTRY; else if self:GetController():IsState(Controller.MOVE_UP) then if self.EffectTimer:IsPastSimMS(10 + math.random(1,10)) then local smoke = CreateMOSParticle("Side Thruster Blast Ball 1"); smoke.Pos = self.Placer.Pos; smoke.Vel = self.Vel + ((smoke.Pos - self.Pos) * (math.random(4,9)/10)); MovableMan:AddParticle(smoke); self.EffectTimer:Reset(); end elseif self:GetController():IsState(Controller.MOVE_LEFT) or self:GetController():IsState(Controller.MOVE_RIGHT) then if self.EffectTimer:IsPastSimMS(30 + math.random(1,50)) then local smoke = CreateMOSParticle("Small Smoke Ball 1"); smoke.Pos = self.Placer.Pos; smoke.Vel = self.Vel + ((smoke.Pos - self.Pos) * (math.random(2,6)/10)); MovableMan:AddParticle(smoke); self.EffectTimer:Reset(); end else if self.EffectTimer:IsPastSimMS(30 + math.random(1,50)) then local smoke = CreateMOSParticle("Tiny Smoke Ball 1"); smoke.Pos = self.Placer.Pos; smoke.Vel = self.Vel + ((smoke.Pos - self.Pos) * (math.random(1,5)/10)); MovableMan:AddParticle(smoke); self.EffectTimer:Reset(); end end if MovableMan:IsActor(self.Pilot) then self.Pilot.Pos.X = 5; self.Pilot.Pos.Y = self.PilotPosY; self.Pilot.Vel = Vector(0,0); self.Pilot.AngularVel = 0; self.Pilot.HitsMOS = false; self.Pilot.GetsHitByMOS = false; self.Pilot:SetControllerMode(Controller.CIM_DISABLED, -1); if self.Pilot:IsPlayerControlled() then ActivityMan:GetActivity():SwitchToActor(self,self.Pilot:GetController().Player,self.Team); end if self.AIMode == Actor.AIMODE_GOLDDIG and self:IsPlayerControlled() and self:GetController():IsState(Controller.PIE_MENU_ACTIVE) then self.Pilot.Pos = self.Pos + Vector(5,5); self:FlashWhite(500); self.Pilot:FlashWhite(1000); self.Pilot.HitsMOS = true; self.Pilot.GetsHitByMOS = true; self.Pilot:SetControllerMode(Controller.CIM_AI, -1); if self:IsPlayerControlled() then ActivityMan:GetActivity():SwitchToActor(self.Pilot,self:GetController().Player,self.Team); end self.Pilot = nil; self.IsPiloted = 0; self.HitsMOS = false; end if self.Health < 2 then self.Pilot.Pos = self.Pos + Vector(5,5); self:FlashWhite(500); self.Pilot:FlashWhite(500); self.Pilot.HitsMOS = true; self.Pilot.GetsHitByMOS = true; self.Pilot:SetControllerMode(Controller.CIM_AI, -1); if self:IsPlayerControlled() then ActivityMan:GetActivity():SwitchToActor(self.Pilot,self:GetController().Player,self.Team); end self.Pilot = nil; self.IsPiloted = 0; self.IsDying = 1; end else self.Pilot = nil; self.IsPiloted = 0; end end if self.IsDying == 0 then self.DeathTimer:Reset(); end if self.Health < 2 then self.IsDying = 1; end if self.DeathTimer:IsPastSimMS(1000) then self:GibThis(); end self.timer:Reset(); end end end function Destroy(self) if ActivityMan:ActivityRunning() then if self.IsPiloted == 1 then if MovableMan:IsActor(self.Pilot) then self.Pilot.Pos = self.Pos + Vector(5,5); self.Pilot:FlashWhite(500); self.Pilot.HitsMOS = true; self.Pilot.GetsHitByMOS = true; self.Pilot:SetControllerMode(Controller.CIM_AI, -1); if self:IsPlayerControlled() then ActivityMan:GetActivity():SwitchToActor(self.Pilot,self:GetController().Player,self.Team); end self.Pilot = nil; end end end end |
Page 1 of 1 | All times are UTC [ DST ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |