function ResourceGatherer() {} ResourceGatherer.prototype.Schema = "Lets the unit gather resources from entities that have the ResourceSupply component." + "" + "2.0" + "1.0" + "" + "1" + "3" + "3" + "2" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""; ResourceGatherer.prototype.Init = function() { }; ResourceGatherer.prototype.GetGatherRates = function() { var ret = {}; for (var r in this.template.Rates) ret[r] = this.template.Rates[r] * this.template.BaseSpeed; return ret; }; ResourceGatherer.prototype.GetRange = function() { return { "max": +this.template.MaxDistance, "min": 0 }; // maybe this should depend on the unit or target or something? } /** * Gather from the target entity. This should only be called after a successful range check, * and if the target has a compatible ResourceSupply. * It should be called at a rate of once per second. */ ResourceGatherer.prototype.PerformGather = function(target) { var rate = this.GetTargetGatherRate(target); if (!rate) return { "exhausted": true }; var cmpResourceSupply = Engine.QueryInterface(target, IID_ResourceSupply); var type = cmpResourceSupply.GetType(); var status = cmpResourceSupply.TakeResources(rate); // Give the gathered resources to the player var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); var cmpOwnership = Engine.QueryInterface(this.entity, IID_Ownership); var cmpPlayer = Engine.QueryInterface(cmpPlayerManager.GetPlayerByID(cmpOwnership.GetOwner()), IID_Player); cmpPlayer.AddResource(type.generic, status.amount); // Tell the target we're gathering from it Engine.PostMessage(target, MT_ResourceGather, { "entity": target, "gatherer": this.entity }); return status; }; /** * Compute the amount of resources collected per second from the target. * Returns 0 if resources cannot be collected (e.g. the target doesn't * exist, or is the wrong type). */ ResourceGatherer.prototype.GetTargetGatherRate = function(target) { var cmpResourceSupply = Engine.QueryInterface(target, IID_ResourceSupply); if (!cmpResourceSupply) return 0; var type = cmpResourceSupply.GetType(); var rate; if (type.specific && this.template.Rates[type.generic+"."+type.specific]) rate = this.template.Rates[type.generic+"."+type.specific]; else rate = this.template.Rates[type.generic]; return (rate || 0) * this.template.BaseSpeed; } Engine.RegisterComponentType(IID_ResourceGatherer, "ResourceGatherer", ResourceGatherer);