@persist [Wirelinks Usage Production]:table @persist RemovalFilter:string [Filter GeneratorCount PumpStatus]:table @persist [FoundEntities]:array MaxEntities SortNum @persist ShipCore:entity MultCap WaterPumpDist @autoupdate @model models/jaanus/wiretool/wiretool_controlchip.mdl if(duped()){exit()} if(dupefinished()){reset()} if(first() | dupefinished()) { entity():setColor(vec(125,250,125)) MultCap = 100 #Maximum multiplier to reflect server limitations WaterPumpDist=250 #Position to check below water pumps #---START OF BASE MULTIPLIERS---# #-----Water Pump-----# Usage["infinity_water_pump",number]=0.5 Production["infinity_water_pump",number]=0.1 #-----Water Air Extractor-----# Usage["infinity_water_splitter",number]=1 Production["infinity_water_splitter",number]=0.01 #-----Hydrogen Fuel Cell-----# Usage["infinity_hydrogen_fuel_cell",number]=0.1 Production["infinity_hydrogen_fuel_cell",number]=0.5 #-----Fusion Reactor-----# Usage["infinity_fusion_reactor",number] = 0.005 Production["infinity_fusion_reactor",number] = 1 #-----Air Compressor-----# Usage["infinity_compressor",number] = 0.5 Production["infinity_compressor",number] = 0 #-----Canister Recycler-----# Usage["infinity_recycler",number] = 0.025 Production["infinity_recycler",number] = 0.001 #-----Antimatter Reactor-----# Usage["infinity_antimatter_reactor",number] = 0.01 Production["infinity_antimatter_reactor",number] = 250 #-----Volatile Storage-----# Usage["infinity_antimatter_storage",number] = 4 Usage["infinity_supercapacitor",number] = 0.2 #---END OF BASE MULTIPLIERS---# ##User Defined Functions function wirelink createWL(Ent:entity) { Ent:makeWirelink() return Ent:getWirelink() } function void storageControl(WL:wirelink, On:number) { WL["Off",number]=!On } function void generatorControl(WL:wirelink, On:number, Mult:number) { WL["On",number]=On WL["Multiplier",number]=Mult } function void addWirelink(Index:string,E:entity) { Wirelinks[Index,wirelink] = createWL(E) Wirelinks[Index,wirelink]["Mute",number] = 1 if(E:type()=="infinity_water_pump") { PumpStatus[E:id():toString(),number]=0 } } function void addDevice(Index:string,Class:string) { Filter[Index,string] = Class } function void setUsage() { foreach(K,V:wirelink=Wirelinks) { TempEnt = V:entity() Usage[K,number] = Usage[TempEnt:type(),number] * TempEnt:volume()/1000 Production[K,number] = Production[TempEnt:type(),number] * TempEnt:volume()/1000 } } function void wirelinkManage(Docked:number) { local Core = ShipCore#Wirelinks["node",wirelink] local Energy = Core:rdAmount("Energy") local MaxEnergy = Core:rdCapacity("Energy") local Water = Core:rdAmount("Water") local MaxWater = Core:rdCapacity("Water") local Oxygen = Core:rdAmount("Oxygen") local MaxOxygen = Core:rdCapacity("Oxygen") local Hydrogen = Core:rdAmount("Hydrogen") local MaxHydrogen = Core:rdCapacity("Hydrogen") local Nitrogen = Core:rdAmount("Nitrogen") local MaxNitrogen = Core:rdCapacity("Nitrogen") local Antimatter = Core:rdAmount("Antimatter") local MaxAntimatter = Core:rdCapacity("Antimatter") local EmptyCanister = Core:rdAmount("Empty Canister") local MaxEmptyCanister = Core:rdCapacity("Empty Canister") local LSCanister = Core:rdAmount("Lifesupport Canister") local MaxLSCanister = Core:rdCapacity("Lifesupport Canister") local Capacitor = Core:getWirelink()["Capacitor",number] local MaxCapacitor = Core:getWirelink()["Max Capacitor",number] foreach(K,V:wirelink=Wirelinks) { local KClass = K:explode(" ")[1,string] local GenCountMul = GeneratorCount[KClass,number] local Use = Usage[K,number] * GenCountMul local Make = Production[K,number] * GenCountMul switch(KClass) { case "infinity_water_pump", ThisPumpDocked = PumpStatus[V:entity():id():toString(),number] On=(ThisPumpDocked) ? (Energy>0) & (Watermin(MaxEnergy*0.25,5)) & (Oxygenmin(MaxWater*0.25,10)) : ((Energy>min(MaxEnergy*0.25,5)) & (Water>min(MaxWater*0.25,2000))) & (Oxygenmin(MaxOxygen*0.5,1000)) & (Hydrogen>min(MaxHydrogen*0.5,2000)) Mult=min(Oxygen/(Use*2), Hydrogen/(Use*4), max((MaxEnergy-Energy)/Make,(MaxWater-Water)/(Use)),MultCap) generatorControl(V,On,Mult) break case "infinity_fusion_reactor", On=(Docked) ? ((Hydrogen > 2) & (Energy > 20) & (Energy min(MaxHydrogen*0.05,50)) & (Energy > 50) & (Energy < MaxEnergy*0.65)) Mult=min(Hydrogen/(Use*1.25), (MaxEnergy-Energy)/(1.25*Make), Energy/(Make),MultCap) generatorControl(V,On,Mult) break case "infinity_compressor", Make = (V:entity():lsNPercent()/10) * V:entity():volume()/1000 On=(Docked) ? ((Energy > min(20000,MaxEnergy*0.3)) & (Nitrogen0)) : ((Energy > min(20000,MaxEnergy*0.2)) & (Nitrogen < MaxNitrogen*0.2) & (V:entity():lsNAmount()>0)) Mult=min(Energy/(Use*(1.25 + 5*(min(Energy 50) & (Hydrogen > 50) & (Energy < MaxEnergy*0.995)) : 0 Mult= min(Antimatter/(Use*1.25),Hydrogen/(Use*1.25),(MaxEnergy-Energy)/(2*Make),MultCap) generatorControl(V,On,Mult) break case "infinity_antimatter_storage", Use = Use/GenCountMul / (V:entity():volume()/1000) On = (Energy > (Use*max(Antimatter,1))*5) storageControl(V,On) break case "infinity_supercapacitor", Use = Use/GenCountMul On = (Nitrogen > (Use*10)) & (Energy > (20*(V:entity():volume()/1000))*0.95) storageControl(V,On) break case "infinity_recycler", On = (EmptyCanister > 1) & (Energy>MaxEnergy*0.2) & (Oxygen > MaxOxygen*0.1) (LSCanister < MaxLSCanister*0.9) Mult = min((10*Oxygen)/(Make*2),Energy/(Use*5),EmptyCanister/(Make*2),min((MaxLSCanister - LSCanister)/(Make*2),MultCap)) generatorControl(V,On,Mult) break default, break } } } function number isDocked() #Return true(1) if at least one water pump is docked { local Docked=0 foreach(PumpID,IsDocked:number=PumpStatus) { local PumpEnt = entity(PumpID:toNumber()) local D = pointHasContent(PumpEnt:toWorld(vec(0,0,-WaterPumpDist)),"water") if(D) { PumpStatus[PumpID,number]=D Docked=max(Docked,D) } } return Docked } #End Functions #Add devices here addDevice("Splitter","infinity_water_splitter") addDevice("Fusion","infinity_fusion_reactor") addDevice("Water","infinity_water_pump") addDevice("Nitrogen","infinity_compressor") addDevice("AMReactor","infinity_antimatter_reactor") addDevice("AMStorage","infinity_antimatter_storage") addDevice("Supercapacitor","infinity_supercapacitor") addDevice("Recycler","infinity_recycler") #Finish adding devices #Ignored devices RemovalFilter = "infinity_atmospheric_probe " +"infinity_resource_monitor " +"infinity_storage_cache " +"infinity_solar_panel " +"infinity_dispenser " #Get ship core and network entities ShipCore = entity():isConstrainedTo():getCoreEnt() FoundEntities = ShipCore:rdNetEntities() MaxEntities = FoundEntities:count() if(!ShipCore) #If shipcore is not found { setName("Disabled - No ship core found.") } } if(changed(MaxEntities)!=0 & MaxEntities > 0) #If new entities are found { foreach(K,V:wirelink=Wirelinks) #Check if any wirelinks are missing. If so, remove them. { if(!V:entity()) { Wirelinks:removeWirelink(K) local Class = K:explode(" ")[1,string] GeneratorCount[Class,number] = GeneratorCount[Class,number] - 1 } } for(I=1,MaxEntities) #Look for new wirelinks { local ID = FoundEntities[I,number] local E = entity(ID) local Class = E:type() local Index = Class + " " + toString(ID) if(!Wirelinks:exists(Index) & !RemovalFilter:find(Class)) { addWirelink(Index,E) GeneratorCount[Class,number] = GeneratorCount[Class,number] + 1 } } Name="" foreach(GenName,GenClass:string=Filter) { local Count = GeneratorCount[GenClass,number] if(Count > 0) { Name = Name + GenName + "(" + toString(Count) + ")" + "\n" } } setName(Name:left(Name:length()-2)) timer("manage",1000) setUsage() } FoundEntities = ShipCore:rdNetEntities() MaxEntities = FoundEntities:count() wirelinkManage(isDocked()) if(clk("manage")){timer("manage",1000)}