123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- import rxactor
- # FlockMember not working at the moment. - Tuco
- import sys
- import clr
- clr.AddReferenceToFile("OpenSim.Region.RexScriptModule.dll")
- asm = clr.LoadAssemblyByName('OpenSim.Region.ScriptEngine.Common')
- Vector3 = asm.OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3
- import math
- import sampleflockinfo
- class FlockMember(rxactor.Actor):
- def __init__(self, vId):
- super(self.__class__,self).__init__(vId)
- self.MyFlock = None
- self.StartLoc = Vector3(0,0,0)
- self.bReady = False
- def GetScriptClassName():
- return "sampleflockmember.FlockMember"
-
- def EventCreated(self):
- super(self.__class__,self).EventCreated()
- self.bReady = True
- self.SetMesh("rabbit")
- self.Activate()
-
- def Activate(self):
- if(not self.bReady):
- return
- if(self.StartLoc == Vector3(0,0,0)):
- self.StartLoc = self.llGetPos()
- self.Physics = True
- self.PhysicsMode = 1
- self.Gravity = False
- self.Velocity = Vector3(0,0,0)
- self.Mass = 15.0
- self.SetTimer(0.1,True)
-
- def Deactivate(self):
- self.SetTimer(0,False)
- self.Velocity = Vector3(0,0,0)
- self.Gravity = True
- self.PhysicsMode = 0
- self.Physics = False
- self.llSetPos(self.StartLoc)
- self.MyFlock = None
- self.DestroyActor()
-
- def GetCenter(self):
- try:
- CurrentCenter = self.MyFlock.Center - self.llGetPos()
- CurrentCenter = CurrentCenter / (self.MyFlock.BoidsInFlock-1)
- return CurrentCenter
- except:
- print "FlockMember,GetCenter", sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2]
- def GetAverageVelocity(self):
- try:
- CurrentAVGVel = self.MyFlock.AVGVel - self.Velocity
- CurrentAVGVel = CurrentAVGVel / (self.MyFlock.BoidsInFlock-1)
- return CurrentAVGVel
- except:
- print "FlockMember,GetAverageVelocity", sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2]
- def AwayFromNeighbors(self):
- try:
- awayvec = Vector3(0,0,0)
- fullaway = Vector3(0,0,0)
- templist = self.GetRadiusActors(self.MyFlock.BoidMinDist)
- for i in templist:
- tempactor = self.MyWorld.AllActors[i]
- if((tempactor != self) and tempactor.__class__.__name__ == "FlockMember"):
- awayvec = self.llGetPos() - tempactor.llGetPos()
- fullaway = (fullaway + awayvec)
- return fullaway
- except:
- print "FlockMember,AwayFromNeighbors", sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2]
- def LimitNewVelocity(self, vStartVel,vLimiter):
- try:
- limitvel = Vector3(vStartVel)
-
- if(math.fabs(vStartVel.x) > math.fabs(vStartVel.y)):
- a = math.fabs(vStartVel.x)
- else:
- a = math.fabs(vStartVel.y)
- if(math.fabs(vStartVel.z) > a):
- a = math.fabs(vStartVel.z)
- if(a < vLimiter):
- return limitvel
- else:
- limitvel.x = (vStartVel.x * vLimiter / a)
- limitvel.y = (vStartVel.y * vLimiter / a)
- limitvel.z = (vStartVel.z * vLimiter / a)
- return limitvel
- except:
- print "FlockMember,LimitNewVelocity", sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2]
- def GetCurrentTarget(self):
- try:
- CurrentTarget = self.MyFlock.GetCurrentTarget()
- if(CurrentTarget != Vector3(0,0,0)):
- return (CurrentTarget-self.llGetPos())
- else:
- return Vector3(0,0,0)
- except:
- print "FlockMember,GetCurrentTarget", sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2]
-
- def EventTimer(self):
- try:
- if(self.MyFlock == None):
- return
- center_bias = self.GetCenter() - self.llGetPos()
- center_bias.x *= 0.6 * self.MyFlock.ModifyCenterBias
- center_bias.y *= 0.6 * self.MyFlock.ModifyCenterBias
- center_bias.z *= 0.6 * self.MyFlock.ModifyCenterBias
- avgvel_bias = self.GetAverageVelocity() - self.Velocity
- avgvel_bias.x *= 0.3
- avgvel_bias.y *= 0.3
- avgvel_bias.z *= 0.3
- awayfrommates = self.AwayFromNeighbors()
- awayfrommates.x *= 0.7
- awayfrommates.y *= 0.7
- awayfrommates.z *= 0.7
- targetbias = self.GetCurrentTarget()
- targetbias.x *= 0.6
- targetbias.y *= 0.6
- targetbias.z *= 0.6
- combinedvel = (center_bias + avgvel_bias + awayfrommates + targetbias)
- combinedvel.x *= 40
- combinedvel.y *= 40
- combinedvel.z *= 40
- limitvel = self.LimitNewVelocity(combinedvel,self.MyFlock.BoidMaxSpeed)
- self.Velocity = limitvel
- except:
- print "FlockMember,EventTimer", sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2]
|