All pastes #1955151 Raw Edit

knorke

public text v1 · immutable
#1955151 ·published 2010-10-05 21:10 UTC
rendered paste body
function gadget:GetInfo()
  return {
    name      = "mining blabla2",
    desc      = "some broken stuff",
    author    = "knorke",
    date      = "4 Okt 2010",
    license   = "oh",
    layer     = 0,
    enabled   = true  --  loaded by default	
  }
end

if (gadgetHandler:IsSyncedCode()) then

local miners = {} --  [unitID] alive: true oder false   cargo: wieviel er trägt  status: was er gerade macht: "loading" "unloading" "mining" "to_res" "to_hq"
local dropoffs = {} --[unitID]
local dropoffs_n = 0
-----config-----
local miner_name = "bminer";
local ressource_name = "bminerals"
local dropoff_name = "bflagshipbase"
local dropoff_distance = 300 --how near do miners have to get to a dropoff to drop their cargo?
----------------
function gadget:UnitFinished(unitID, unitDefID, teamID)
	if (is_miner_type (unitDefID) == true) then add_miner (unitID) end
	if (is_dropoff_type (unitDefID) == true) then add_dropoff (unitID) end
end

function gadget:UnitDestroyed(unitID, unitDefID, teamID, attackerID)
	--remove destroyed miners:
	if is_miner (unitID) then remove_miner (unitID) end
	--remove destroyed dropoffs:
	if is_dropoff (unitID) then remove_dropoff (unitID) end
	--wenn etwas geerntet wurde:
	if (is_ressource_type (unitDefID)) then Spring.Echo ("ressource mined") end
	if (is_miner(attackerID)) then Spring.Echo ("miner mined") end
	if (is_ressource_type (unitDefID) and is_miner(attackerID)) then
		miners[attackerID].cargo = miners[attackerID].cargo + 25
		if (miners[attackerID].cargo > 0) then 	--send full miners to dropoff
			local x, y, z = Spring.GetUnitPosition(attackerID)
			local tx, ty, tz = nearest_dropoff_position_from_miner (attackerID)
			if (tx ~= nil) then
				Spring.GiveOrderToUnit(attackerID, CMD.MOVE_STATE, { 2 }, {})
				Spring.GiveOrderToUnit(attackerID, CMD.MOVE , {tx+50, ty, tz  }, {})
			end
		end
		Spring.Echo ("finished mining! cargo:" .. miners[attackerID].cargo)
		end
end


function gadget:GameFrame(frameNum) 
	_G.miners = miners
	_G.dropoffs = dropoffs
	
	for i in pairs(miners) do
		if (is_miner_at_dropoff (i)) then	--drop the cargo			
			local minerteam = Spring.GetUnitAllyTeam  (i)
			Spring.AddTeamResource (minerteam, "metal", miners[i].cargo*10)
			miners[i].cargo = 0 
			local x, y, z = Spring.GetUnitPosition(i)
			--back to mining: ***this needs work!
			--Spring.GiveOrderToUnit(i, CMD.MOVE_STATE, { 2 }, {})
			Spring.GiveOrderToUnit(i, CMD.AREA_ATTACK , { x, y, z,5000  }, {}) 
			Spring.Echo ("sending " .. i .. " to mine")
			end
		end
end

function gadget:Initialize()
	make_miner_table()	
	_G.miners = miners;
	_G.dropoffs = dropoffs
	_G.dropoff_distance = dropoff_distance
end

function marker_on_unit (_uID, _text)
	if (markers == false) then return end
	if (_uID == nil) then return end
	if (_text == nil) then return end
	local x,y,z=Spring.GetUnitPosition (_uID)
	if (x == nil or y == nil or z == nil) then return end
	Spring.MarkerAddPoint (x,y,z, _text .. "id:" .. _uID)
end

function make_miner_table()
	miners = {}
	local all_units = Spring.GetAllUnits ()
	for i in pairs(all_units) do
		local unitDefID = Spring.GetUnitDefID(all_units[i])
		if (is_miner_type (unitDefID)==true) then
			add_miner (all_units[i])
		end
		if (is_dropoff_type (unitDefID)==true) then
			add_dropoff (all_units[i])
		end
	end
end

function is_miner_type (unitDefID)
	if (unitDefID == nil) then return false end
	local unitDef = UnitDefs[unitDefID]
	if (unitDef == nil) then return false end
	if (unitDef.name == miner_name) then return true end
	return false
end


function is_dropoff_type (unitDefID)
	if (unitDefID == nil) then return false end
	local unitDef = UnitDefs[unitDefID]
	if (unitDef == nil) then return false end
	if (unitDef.name == dropoff_name) then return true end
	return false
end

function is_ressource_type (unitDefID)
	if (unitDefID == nil) then return false end
	local unitDef = UnitDefs[unitDefID]
	if (unitDef == nil) then return false end
	if (unitDef.name == ressource_name) then return true end
	return false
end


function is_miner (unitID)
	if (miners [unitID] ~= nil) then return true else return false end
end

function is_dropoff (unitID)
	if (dropoffs [unitID] ~= nil) then return true else return false end
end


function nearest_dropoff_position_from_miner (minerID)
	local nearest_distance = 9999999999
	local nearest_dropoffID = nil
	for i in pairs (dropoffs) do
		local d = Spring.GetUnitSeparation (minerID, i)
		if (d < nearest_distance) then
			nearest_distance = d
			nearest_dropoffID = i
			end
	end
	if (nearest_dropoffID ~= nil) then
		return Spring.GetUnitPosition (nearest_dropoffID)
	else
		return nil
	end
end

function add_miner (unitID)
	miners [unitID] = {}
	miners [unitID].alive = true
	miners [unitID].cargo = 0
	marker_on_unit (unitID, "miner added")
end

function add_dropoff (unitID)
	dropoffs [unitID] = {}
	dropoffs [unitID].alive = true
	dropoffs [unitID].cargo = 0
	marker_on_unit (unitID, "droppoff added")
end

function remove_miner (unitID)
Spring.Echo ("removing miner id=" .. unitID)
miners [unitID].alive=false
miners [unitID] = nil
miners_n = miners_n - 1
end

function remove_dropoff (unitID)
Spring.Echo ("removing dropoff id=" .. unitID)
dropoffs [unitID].alive=false
dropoffs [unitID] = nil
dropoffs_n = dropoffs_n - 1
end

function is_miner_at_dropoff (miner_unitID)
	for i in pairs (dropoffs) do
		if Spring.GetUnitSeparation (miner_unitID, i) < dropoff_distance then return true end
		end
	return false
end

--------------------------------------------------------
--Border between SYNC and UNSYNC
--when i wear my frilly dress im a real touhou
end
if (not gadgetHandler:IsSyncedCode()) then
--------------------------------------------------------

--Length of table, for synced (using spairs)
function sxlen(tbl)
	local qq = 0;
	for v in spairs(tbl) do
		qq = qq + 1;
	end
	return qq;
end

function gadget:DrawScreen()
	gl.Color(0.5, 0.5, 0.5, 1)
	local ty = 0
	for i in spairs(SYNCED.miners) do
		ty = ty + 1
		gl.Text (ty .."| [" .. i .. "]".. "cargo:" .. SYNCED.miners[i].cargo, 100,300-ty*25 , 25, 'o')
	end
	gl.Text ("miners counted="..ty .. "#miners:" .. sxlen(SYNCED.miners), 100,300 , 25, 'o')
end

function gadget:DrawWorldPreUnit()
	gl.LineWidth(5.0)
	for i in spairs(SYNCED.dropoffs) do
		local x,y,z=Spring.GetUnitPosition (i)
		if (x ~= nil and y ~= nil and z ~= nil) then
			gl.Color(1, 1, 1, 1)
			gl.DrawGroundCircle (x,y,z, SYNCED.dropoff_distance, 8) --all dropoffs marked with octagon
			end
	end
	
	for i in spairs(SYNCED.miners) do
			if (SYNCED.miners[i].alive == true and i ~= nil and SYNCED.miners[i] ~=nil) then
			local x,y,z=Spring.GetUnitPosition (i)
			if (x ~= nil and y ~= nil and z ~= nil) then
				gl.Color(0, 1, 0, 1)
				--gl.DrawGroundCircle (x,y,z, 50, 4) --all miners marked with a diamond shape
				--cargo status
				gl.Color(1, 0, 0, 1)
				gl.DrawGroundCircle (x,y,z, 30, 3)
				gl.Color(1, 1, 0, 1)
				gl.DrawGroundCircle (x,y,z, SYNCED.miners[i].cargo, 3)  --growing triangle shows cargo status
			end
		end
	end
end

end