Home Showcase
Welcome to the new Diaspora forums, please let us know if you see anything broken! Notice: Some users may need to reupload their avatars due to an issue during forum setup!

LocTECH drones

SweetOneSweetOne Registered Posts: 39
edited May 2014 in Showcase #1
So I bring you LocTECH drones ( yes my aka is LocInt ).

My drones avoid collisions and orbit their target. Each drone has unique place in the orbit. If you remove one a new drone can replace it's place on orbit.

These drones also detect guns which are close and drone automatically links those guns to the drone.

They use global variables so they can communicate with each other and with their controller unit. In my case my A.I rose is sending them variables like when to activate or fire.

You can't activate these drones without basic knowledge of Expression2.

You need to send these global variables if you want these drones to work:
"Target"
"Active"
"Fire

One drone uses around 200us.

Thanks to brandon for collision detection and thanks to divran for helping me out with global variables.

Enjoy!

@name LocTECH_drone_v2.2
@persist Dest:vector
@persist Players:array Gunz:array Offsets:array
@persist [DodgeBox AvoidPos]:table G:gtable
@persist Drone:entity Target:entity
@persist AvoidBox:ranger
@persist Speed OrbitRadius Offset Fire
@model models/Spacebuild/milcock7_emount1.mdl

if( first() | dupefinished()) {
    
    GROUP = "LocTECH"
    dsJoinGroup(GROUP)
    dsSend("FIGHTER_JOINED", GROUP, entity())
    
    G = gTable(GROUP,0)
    
    for(I=1,9) {
        if (!G[I,number]) {
            G[I,number] = 1 #set to true, for "this spot is taken"
            Offset = I * 100
             break

        }
    }
    
    runOnChat(1)
    runOnLast(1)
    Drone=entity()
    Drone:propGravity(0)
    Speed=80
    
    Offsets[G[1,number], number] = 100
    Offsets[G[2,number], number] = 200
    Offsets[G[3,number], number] = 300
    Offsets[G[4,number], number] = 400
    Offsets[G[5,number], number] = 500
    Offsets[G[6,number], number] = 600
    Offsets[G[7,number], number] = 700
    Offsets[G[8,number], number] = 800
    Offsets[G[9,number], number] = 900


    
#Find only owner gunz.
    
    for(I=1,Players:count()) {
        findExcludePlayerProps(Players[I,entity])
    }
    
    findAllowPlayerProps(owner())
    findIncludeClass("sc_weapon_base")
    findInSphere(Drone:pos(),100)
    findSortByDistance(Drone:pos())
    Gunz=findToArray()
    
    if (!(Gunz)) {
        print("Unable to find a gun close enough!")
        
#Lets wire those gunz 
    }
    if(Gunz){
        for(I=1,Gunz:count()) {
            Gunz[I, entity]:wirelink() 
            Gun=Gunz[I, wirelink]
            print(Gunz[I, entity]:toString()+" link has been made")
        }
    }
}
#See if the drone is activated
Active=gGetNum("Active")
#What happens if its active
if(Active){
    timer("boxCheck",100)
    timer("unFreeze&RadiusCheck",2000)
#Lets request stuff from rose

    Target=gGetEnt("Target")
    Fire=gGetNum("Fire") 


    if(clk("boxCheck")){
#Filtering rangers
    rangerFilter(Drone)
    rangerFilter(Drone:getConstraints())
    rangerHitWater(1)
    rangerDefaultZero(0)

#We need a box to avoid
    AvoidBox = rangerOffsetHull(Drone:toWorld(vec(-Drone:boxSize():x()*10, 0, 0)),
    Drone:toWorld(vec(Drone:boxSize():x()*10, 0, 0)), Drone:boxSize()*1.8)
    }
    
#1st target is always chosen    
    Dest=Target:boxCenterW()
#What happens when we hit it
    if(AvoidBox:hit()){
        
        timer("weHitSomething",200)
    }

    if(clk("weHitSomething")){

#where did the hit come from?
        DodgeBox["UP", ranger] = rangerOffset(750,entity():pos(), Drone:up())
        DodgeBox["DOWN", ranger] = rangerOffset(750,entity():pos(), -Drone:up())
        DodgeBox["FORWARD", ranger] = rangerOffset(750,entity():pos(), Drone:forward())
        DodgeBox["FORWARDRIGHT", ranger] = rangerOffset(750,entity():pos(), Drone:forward()+Drone:right())
        DodgeBox["FORWARDLEFT", ranger] = rangerOffset(750,entity():pos(), Drone:forward()-Drone:right())
        DodgeBox["BACK", ranger] = rangerOffset(750,entity():pos(), -Drone:forward())
        DodgeBox["BACKRIGHT", ranger] = rangerOffset(750,entity():pos(), -Drone:forward()+Drone:right())
        DodgeBox["BACKLEFT", ranger] = rangerOffset(750,entity():pos(), -Drone:forward()-Drone:right())
        DodgeBox["RIGHT", ranger] = rangerOffset(750,entity():pos(), Drone:right())
        DodgeBox["LEFT", ranger] = rangerOffset(750,entity():pos(), -Drone:right())
            

        if(DodgeBox["UP", ranger]:hit())
        {
            
            AvoidPos[1, vector] = -Drone:up()+Drone:boxCenterW()

        }else{
        
            AvoidPos[1, vector] = vec(0,0,0)
        }
       
        if(DodgeBox["DOWN", ranger]:hit())
        {
            AvoidPos[2, vector] = Drone:up()+Drone:boxCenterW()
            
        }else{
        
            AvoidPos[2, vector] = vec(0,0,0)
        }
       
        if(DodgeBox["FORWARD", ranger]:hit()){
            
            AvoidPos[3, vector] =  -Drone:forward()+Drone:boxCenterW()
            
        }else{
        
            AvoidPos[3, vector] = vec(0,0,0)
        }
        if(DodgeBox["FORWARDRIGHT", ranger]:hit()){
            
            AvoidPos[4, vector] = -Drone:forward()-Drone:right()+Drone:boxCenterW()
            
        }else{
        
            AvoidPos[4, vector] = vec(0,0,0)
        }
        if(DodgeBox["FORWARDLEFT", ranger]:hit()){
            
            AvoidPos[5, vector] = -Drone:forward()+Drone:right()+Drone:boxCenterW()
            
        }else{
        
            AvoidPos[5, vector] = vec(0,0,0)
        }
        if(DodgeBox["BACK", ranger]:hit()){
            
            AvoidPos[6, vector] =  Drone:forward()+Drone:boxCenterW()
            
        }else{
        
            AvoidPos[6, vector] = vec(0,0,0)
        }
        if(DodgeBox["BACKRIGHT", ranger]:hit()){
            
            AvoidPos[7, vector] = Drone:forward()-Drone:right()+Drone:boxCenterW()
            
        }else{
        
            AvoidPos[7, vector] = vec(0,0,0)
        }
        if(DodgeBox["BACKLEFT", ranger]:hit()){
            
            AvoidPos[8, vector] = Drone:forward()+Drone:right()+Drone:boxCenterW()
            
        }else{
        
            AvoidPos[8, vector] = vec(0,0,0)
        }
        if(DodgeBox["LEFT", ranger]:hit()){
            
            AvoidPos[9, vector] =  Drone:right()+Drone:boxCenterW()
            
        }else{
        
            AvoidPos[9, vector] = vec(0,0,0)
        }
        if(DodgeBox["RIGHT", ranger]:hit()){
            
            AvoidPos[10, vector] = -Drone:right()+Drone:boxCenterW()
            
        }else{
        
            AvoidPos[10, vector] = vec(0,0,0)
        }
#lets add new movement vectors       
        for(I=1,AvoidPos:count()) {
            Dest = Dest + AvoidPos[I, vector]
        }
        
        stoptimer("weHitSomething")
        
    }
#orbit
    Circle=vec(0,1,0):rotate(0,(curtime()+Offset)*Speed,0)

    Vector=Dest+(Circle*OrbitRadius):setZ(Target:getSigRad()/pi())
    Pos = Target:toWorld(Target:boxCenter()+vec(0,0,-15))
    Eye = (Pos-Drone:pos()+Target:vel()):normalized()
    A = Eye:toAngle()
    TarQ = quat(A)
    CurQ = quat(Drone)
    Q = TarQ/CurQ
    T = Drone:toLocal(rotationVector(Q)+Drone:pos())
#we want to look on our target
    Drone:applyTorque((150*T - 12*Drone:angVelVector())*Drone:inertia())     
#we want to catch our target
    Drone:applyForce((((Vector-Drone:pos()))*Drone:mass()))
    
    
    
}else{
    Fire=0
}
if(Fire){
    
    for(I=1,Gunz:count()) {
        Gun=Gunz[I, wirelink]
           Gun["Fire",number]=1
    }
}
else{
    
       for(I=1,Gunz:count()) {
        Gun=Gunz[I, wirelink]
           Gun["Fire",number]=0
    } 
}
if(clk("unFreeze&RadiusCheck")){
    
    DroneProp = Drone:getConstraints()
    
    for(I=1, DroneProp:count()){
      DroneProp:entity(I):propFreeze(0)
     }
     Drone:propFreeze(0)

    if(Target:getSigRad()>2000){
        
        OrbitRadius=Target:getSigRad()
        
    }
    elseif(Target:getSigRad()>6000){
    
        OrbitRadius=6000
    }
    else{
        
        OrbitRadius=1000
        
    }
    stoptimer("unFreeze&RadiusCheck")
}

if(last() | removing()) {
#lets remove deleted drone from the orbit in case someone spawn new one
    G[Offset/100,number] = 0

}


Leave a Comment

BoldItalicStrikethroughOrdered listUnordered list
Emoji
Image
Align leftAlign centerAlign rightToggle HTML viewToggle full pageToggle lights
Drop image/file