#Information about this E2 #Author: Mouldy_Taco # #This E2 was designed with the finished product in mind ############################################################## #######THIS E2 SHOULD ONLY BE SPAWNED ON COMPLETED SHIPS###### #####I CANNOT GUARUNTEE EFFECTIVENESS ON UNFINISHED SHIPS##### ############################################################## # #How to use: #1. Spawn the chip on your completed ship/station/base #That's it! # #This E2 will detect and utilize both conventional life support AND mining addon system. #It will also produce Support Energy, granted you have the correct generators spawned #Ship Environments (From Entities tab) can also be controlled by this E2! #The only thing it will not control is your mining rigs and lasers. Turn those on yourself! # #Keep in mind that it searches for entities through constraints: #Make sure everything is welded together! # #It will find water pumps on its own, no need to weld those to anything # #Have fun! #Feel free to distribute this, but please do not distribute modified versions. @name SB-Complete Life Support Solution @persist [Wirelinks Usage Production]:table @persist [LSRequirements SupEnergyOpt MiningRequirements FuelAddon]:table @persist [FoundEntities SupEDevices]:array @persist [Name ClimateControl EntityFilter]:string [ResourceNode RegulatorE]:entity @persist N MaxEntities DoMining DoLS DoFuel DoSupE @persist Regulator:wirelink Hash RunTime @model models/Slyfo/crate_watersmall.mdl if(first()|dupefinished()) { Hash=hashNoComments() print(2,toString(Hash)) fileLoad("MT/CLSSCache.txt") httpRequest("http://diaspora-community.com/viewtopic.php?f=18&t=540") runOnFile(1) runOnHTTP(1) runOnLast(1) entity():setMaterial("models/props_combine/combine_intmonitor001_disp") StartTime=curtime() LSRequirements=invert(table("storage_cache","generator_liquid_hvywater","generator_energy_steam_turbine","generator_gas_o2h_water")) SupEnergyOpt=invert(table("storage_energy","generator_energy_fusion","pn_reactor")) MiningRequirements=invert(table("storage_cache","storage_metal","ore_refinery")) FuelAddon=invert(table("storage_pnfuel","storage_carbon","ship_fuel_refinery")) ClimateControl="ls_core" EntityFilter="prop wire gmod mini func" #Water Pump Usage["generator_liquid_water models/chipstiks_ls3_models/largeh2opump/largeh2opump.mdl",number]=172 Production["generator_liquid_water models/chipstiks_ls3_models/largeh2opump/largeh2opump.mdl",number]=464 Usage["generator_liquid_water models/ce_ls3additional/water_pump/water_pump.mdl",number]=33 Production["generator_liquid_water models/ce_ls3additional/water_pump/water_pump.mdl",number]=259 Usage["generator_liquid_water models/props_phx/life_support/gen_water.mdl",number]=13 Production["generator_liquid_water models/props_phx/life_support/gen_water.mdl",number]=97 #----Heavy Water Electrolyzer-----# Usage["generator_liquid_hvywater models/ce_ls3additional/water_heater/water_heater.mdl",number]=81 Production["generator_liquid_hvywater models/ce_ls3additional/water_heater/water_heater.mdl",number]=80 Usage["generator_liquid_hvywater models/chipstiks_ls3_models/nitrogenliquifier/nitrogenliquifier.mdl",number]=84 Production["generator_liquid_hvywater models/chipstiks_ls3_models/nitrogenliquifier/nitrogenliquifier.mdl",number]=83 Usage["generator_liquid_hvywater models/props_wasteland/laundry_washer003.mdl",number]=350 Production["generator_liquid_hvywater models/props_wasteland/laundry_washer003.mdl",number]=345 #----Steam Turbine-----# Usage["generator_energy_steam_turbine models/ce_ls3additional/water_heater/water_heater.mdl",number]=31 Production["generator_energy_steam_turbine models/ce_ls3additional/water_heater/water_heater.mdl",number]=278 #----Water Air Extractor-----# Usage["generator_gas_o2h_water models/ce_ls3additional/water_heater/water_heater.mdl",number]=578 Production["generator_gas_o2h_water models/ce_ls3additional/water_heater/water_heater.mdl",number]=289 Usage["generator_gas_o2h_water models/ce_ls3additional/water_air_extractor/water_air_extractor.mdl",number]=117 Production["generator_gas_o2h_water models/ce_ls3additional/water_air_extractor/water_air_extractor.mdl",number]=59 Usage["generator_gas_o2h_water models/lifesupport/generators/waterairextractor.mdl",number]=250 Production["generator_gas_o2h_water models/lifesupport/generators/waterairextractor.mdl",number]=125 #----PN Reactor-----# Usage["pn_reactor models/tiberium/medium_tiberium_reactor.mdl",number]=250 Production["pn_reactor models/tiberium/medium_tiberium_reactor.mdl",number]=3000 Usage["pn_reactor models/tiberium/large_tiberium_reactor.mdl",number]=750 Production["pn_reactor models/tiberium/large_tiberium_reactor.mdl",number]=10000 #----Ore Refinery-----# Usage["ore_refinery models/tiberium/tiberium_refinery.mdl",number]=1000 Production["ore_refinery models/tiberium/tiberium_refinery.mdl",number]=400 #----Ship Fuel Refinery-----# Usage["ship_fuel_refinery models/punisher239/punisher239_reactor_big.mdl",number]=80 Production["ship_fuel_refinery models/punisher239/punisher239_reactor_big.mdl",number]=200 timer("setname",1000) timer("discovery",50) } if(fileClk()) { if(fileStatus()==3) { #printColor(vec(255,0,0),"You seem to be using this E2 for the first time!\nPlease familiarize yourself with the comments\nat the beginning of the E2 before spawning me again!") #fileWrite("MT/CLSSCache.txt","0") #selfDestruct() } elseif(fileStatus()==1) { Tally=fileRead():toNumber()+1 printColor(vec(180,0,180),"Welcome Back! You have spawned this E2 ",vec(100,255,100),toString(Tally),vec(180,0,180)," times!",vec(255,150,0),"\nPlease check the E2 for any relevant information") fileWrite("MT/CLSSCache.txt",toString(Tally)) } } if(httpClk()) { if(httpData():find(toString(Hash))==0) { printColor(vec(255,0,0),"Outdated or modified E2!\n",vec(50,200,50),"To update, visit:\n",vec(100,100,255),"http://diaspora.100paperclips.com/viewtopic.php?f=18&t=540") } } if(clk("setname")) { RunTime++ Composite=((RunTime<36000) ? "0" : "" )+toString(floor(RunTime/3600))+":"+ ((RunTime<600) ? "0" : "" )+ toString(floor(RunTime/60))+":"+ (((RunTime%60)<10) ? "0" : "" )+ toString(RunTime%60) setName("Runtime: "+Composite+"\n"+Name) timer("setname",1000) } if(clk("discovery")) { FoundEntities=entity():getConstraints() MaxEntities=FoundEntities:count() N=1 if(MaxEntities>3) { timer("filter",50) } else { Name="Unable to identify connected mass as a ship" } } if(clk("filter")) { if(N<=MaxEntities) { Name="Scanning Entities: "+toString(round(N/MaxEntities*100))+"% Complete" Class=FoundEntities[N,entity]:type() if(EntityFilter:find(Class:left(4))) { FoundEntities:remove(N) #MaxEntities=FoundEntities:count() timer("filter",50) } if(Class=="generator_liquid_water") { TempEnt=FoundEntities[N,entity] TempEnt:makeWirelink() Wirelinks[TempEnt:type(),wirelink]=TempEnt:getWirelink() Wirelinks["generator_liquid_water",wirelink]["Mute",number]=1 } if(SupEnergyOpt:exists(Class)) { TempEnt=FoundEntities[N,entity] TempEnt:makeWirelink() if(TempEnt:type():find("storage")) { Wirelinks[TempEnt:type(),wirelink]=TempEnt:getWirelink() } else { SupEDevices:pushWirelink(TempEnt:getWirelink()) } } if(ClimateControl==Class) { TempEnt=FoundEntities[N,entity] TempEnt:makeWirelink() Regulator=TempEnt:getWirelink() Wirelinks[TempEnt:type(),wirelink]=TempEnt:getWirelink() RegulatorE=TempEnt timer("filter",50) N++ } elseif(Class=="resource_node") { if(FoundEntities[N,entity]:pos():distance(entity():pos())0) { DoSupE=1 print("Detected Support Energy Devices") } Name="Scanning Entities: 100% Complete" N=1 MaxEntities=FoundEntities:count() if(ResourceNode) { timer("link",100) } else { Name="Could not find Resource Node! Code Halted!" } } } if(clk("link")) { if(N<=MaxEntities) { Name="Linking Components: "+toString(round(N/MaxEntities*100))+"% Completed" TempEnt=FoundEntities[N,entity] if(TempEnt:rdNetID()==0&TempEnt:pos():distance(ResourceNode:pos())<=2030) { TempEnt:link(ResourceNode) } N++ timer("link",100) } else { timer("findpump",500) timer("resourcemanage",1000) Name="Detected Systems: "+(DoLS ? "\nBasic Lifesupport" : "")+(DoMining ? "\nMetal Production" : "") +(DoFuel ? "\nFuel Production" : "")+(DoSupE ? "\nSupport Energy Production" : "") } } if(DoLS&clk("findpump")&!Wirelinks:exists("generator_liquid_water")) { timer("findpump",5000) findIncludeClass("generator_liquid_water") Found=findInSphere(ResourceNode:pos(),2000) if(Found>0) { FoundPumps=findToArray() for(I=1,FoundPumps:count()) { TempEnt=FoundPumps[I,entity] Const=invert(TempEnt:getConstraints()) Concat=Const:keys():concat(" ") if(TempEnt:owner()==owner()&Concat:find("resource_node")==0) { N=1 TempEnt:link(ResourceNode) TempEnt:makeWirelink() Wirelinks[TempEnt:type(),wirelink]=TempEnt:getWirelink() Wirelinks["generator_liquid_water",wirelink]["Mute",number]=1 } } } } elseif(DoLS&clk("findpump")) { timer("findpump",5000) Pump=Wirelinks["generator_liquid_water",wirelink] if(Pump:entity():id()==0|Pump:entity():pos():distance(ResourceNode:pos())>2040) { Wirelinks:remove("generator_liquid_water") } } if(clk("resourcemanage")) { TempWL=Wirelinks["storage_cache",wirelink] MaxEnergy=TempWL["Max Energy",number] Energy=TempWL["Energy",number] if(DoLS) { MaxWater=TempWL["Max Water",number] MaxSteam=TempWL["Max Steam",number] MaxOxygen=TempWL["Max Oxygen",number] MaxHydrogen=TempWL["Max Hydrogen",number] Water=TempWL["Water",number] Steam=TempWL["Steam",number] Oxygen=TempWL["Oxygen",number] Hydrogen=TempWL["Hydrogen",number] } if(DoMining) { MaxOre=Wirelinks["storage_cache",wirelink]["Max Ore",number] MaxMetal=Wirelinks["storage_metal",wirelink]["Max Metal",number] Ore=Wirelinks["storage_cache",wirelink]["Ore",number] Metal=Wirelinks["storage_metal",wirelink]["Metal",number] if(DoFuel) { MaxCarbon=Wirelinks["storage_carbon",wirelink]["Max Ore",number] CarbonLimit=min(MaxCarbon*0.985,40000) MaxPN=Wirelinks["storage_cache",wirelink]["Max Polonium Nitrate",number] MaxPNFuel=Wirelinks["storage_pnfuel",wirelink]["Max PN-Fuel",number] Carbon=Wirelinks["storage_carbon",wirelink]["Carbon",number] PN=Wirelinks["storage_cache",wirelink]["Polonium Nitrate",number] PNFuel=Wirelinks["storage_pnfuel",wirelink]["PN-Fuel",number] } } if(DoSupE) { HeavyWater=Wirelinks["storage_cache",wirelink]["Hvy Water",number] MaxSupportEnergy=Wirelinks["storage_energy",wirelink]["Max Support Energy",number] SupportEnergy=Wirelinks["storage_energy",wirelink]["Support Energy",number] } timer("resourcemanage",1000) Docked=Wirelinks:exists("generator_liquid_water")&Wirelinks["generator_liquid_water",wirelink]:entity():isUnderWater() Regulator["On",number]=((RegulatorE&(RegulatorE:lsO2Percent()<5|!inrange(RegulatorE:lsTemperature(),275,305)))&(Energy>1000)) if(Docked) { if(DoLS) { TempWL=Wirelinks["generator_liquid_water",wirelink] TempEnt=TempWL:entity() WaterProduction=Production[TempEnt:type()+" "+TempEnt:model(),number] EnergyUsage=Usage[TempEnt:type()+" "+TempEnt:model(),number] TempWL["On",number]=((Energy>10)&(Water1000)) TempWL["Multiplier",number]=min(Energy/(EnergyUsage*2),(MaxWater-Water)/(1.05*WaterProduction)) TempWL=Wirelinks["generator_liquid_hvywater",wirelink] TempEnt=TempWL:entity() SteamProduction=Production[TempEnt:type()+" "+TempEnt:model(),number] WaterUsage=Usage[TempEnt:type()+" "+TempEnt:model(),number] TempWL["On",number]=(Energy>50)&(Water>100)&(Steam10)) TempWL["Multiplier",number]=min(Steam/(SteamUsage*1.15),((MaxEnergy-Energy)/(1.5*EnergyProduction))) TempWL=Wirelinks["generator_gas_o2h_water",wirelink] TempEnt=TempWL:entity() OxygenProduction=Production[TempEnt:type()+" "+TempEnt:model(),number] WaterUsage=Usage[TempEnt:type()+" "+TempEnt:model(),number] HydrogenProduction=OxygenProduction*2 TempWL["On",number]=(Energy>MaxEnergy*0.1)&(OxygenMaxWater*0.1|Water>500000000) TempWL["Multiplier",number]=min(Water/(WaterUsage*6),max((MaxOxygen-Oxygen)/(1.5*OxygenProduction),(MaxHydrogen-Hydrogen)/(1.5*HydrogenProduction))) } if(DoMining) { TempWL=Wirelinks["ore_refinery",wirelink] TempEnt=TempWL:entity() OreUsage=Production[TempEnt:type()+" "+TempEnt:model(),number] MetalProduction=Usage[TempEnt:type()+" "+TempEnt:model(),number] TempWL["On",number]=(Ore>1000)&(((Metal<(MaxMetal*0.97)))|((DoFuel&Carbon(MaxEnergy*0.3)))) TempWL["Multiplier",number]=min(Ore/(OreUsage*25),(DoFuel&(Carbon1000)&(Carbon>2000)&(Energy>(MaxEnergy*0.3)) TempWL["Multiplier",number]=min(PN/(PNUsage*25),Carbon/(PNUsage*2*1.25),(MaxPNFuel-PNFuel)/(1.5*PNFuelProduction)) } } if(DoSupE) { if(SupportEnergy<(MaxSupportEnergy*0.99)&Energy>MaxEnergy*0.3) { for(I=1,SupEDevices:count()) { TempWL=SupEDevices[I,wirelink] TempEnt=TempWL:entity() if(TempEnt:type():find("pn")) { TempWL["On",number]=PN>20000 } else { TempWL["On",number]=Water>1000&HeavyWater>1 } } } else { for(I=1,SupEDevices:count()) { TempWL=SupEDevices[I,wirelink] TempWL["On",number]=0 } } } } if(!Docked) { if(DoLS) { TempWL=Wirelinks["generator_liquid_hvywater",wirelink] TempEnt=TempWL:entity() SteamProduction=Production[TempEnt:type()+" "+TempEnt:model(),number] WaterUsage=Usage[TempEnt:type()+" "+TempEnt:model(),number] TempWL["On",number]=(Energy>MaxEnergy*0.01)&((Water>MaxWater*0.3)&(SteamMaxSteam*0.05))|((WaterMaxSteam*0.1))|(Water==0&Steam>0) TempWL["Multiplier",number]=min(Steam/SteamUsage,(MaxEnergy*0.95-Energy)/EnergyProduction,90000000001*(Water>=(MaxWater*0.05))+(MaxWater*0.95-Water)/SteamUsage) TempWL=Wirelinks["generator_gas_o2h_water",wirelink] TempEnt=TempWL:entity() OxygenProduction=Production[TempEnt:type()+" "+TempEnt:model(),number] WaterUsage=Usage[TempEnt:type()+" "+TempEnt:model(),number] HydrogenProduction=OxygenProduction*2 TempWL["On",number]=(Energy>MaxEnergy*0.05)&((Oxygen50000) TempWL["Multiplier",number]=Water/(WaterUsage*12) } if(DoMining) { TempWL=Wirelinks["ore_refinery",wirelink] TempEnt=TempWL:entity() OreUsage=Production[TempEnt:type()+" "+TempEnt:model(),number] MetalProduction=Usage[TempEnt:type()+" "+TempEnt:model(),number] TempWL["On",number]=(Ore>1000)&(((Metal<(MaxMetal*0.97)))|((DoFuel&Carbon(MaxEnergy*0.3)))) TempWL["Multiplier",number]=min(Ore/(OreUsage*25),(DoFuel&(Carbon2500)&(Carbon>2000)&(Energy>(MaxEnergy*0.1)) TempWL["Multiplier",number]=min(PN/(PNUsage*45),Carbon/(PNUsage*2*1.25),(MaxPNFuel-PNFuel)/(1.5*PNFuelProduction)) } } if(DoSupE) { if(SupportEnergy<(MaxSupportEnergy*0.99)&Energy>MaxEnergy*0.1) { for(I=1,SupEDevices:count()) { TempWL=SupEDevices[I,wirelink] TempEnt=TempWL:entity() if(TempEnt:type():find("pn")) { TempWL["On",number]=(PN>MaxPN*0.5)|(!DoLS&PN>1000&Energy<(MaxEnergy*0.5)) } else { TempWL["On",number]=Water>MaxWater*0.15&HeavyWater>1 } } } else { for(I=1,SupEDevices:count()) { TempWL=SupEDevices[I,wirelink] TempWL["On",number]=0 } } } } } if(last()) { foreach(Key,TempWL:wirelink=Wirelinks) { TempWL["On",number]=0 } }