Source: components/Looter.js

function Looter() {}

Looter.prototype.Schema =
	"<empty/>";

Looter.prototype.Serialize = null; // We have no dynamic state to save

/**
 * Try to collect loot from target entity
 */
Looter.prototype.Collect = function(targetEntity)
{
	var cmpLoot = Engine.QueryInterface(targetEntity, IID_Loot);
	if (!cmpLoot)
		return;

	// Loot experience points as defined in the template
	var xp = cmpLoot.GetXp();
	if (xp > 0)
	{
		let cmpPromotion = Engine.QueryInterface(this.entity, IID_Promotion);
		if (cmpPromotion)
			cmpPromotion.IncreaseXp(xp);
	}

	// Loot resources as defined in the templates
	var resources = cmpLoot.GetResources();
	for (let type in resources)
		resources[type] = ApplyValueModificationsToEntity("Looter/Resource/"+type, resources[type], this.entity);

	// TODO: stop assuming that cmpLoot.GetResources() delivers all resource types (by defining them in a central location)

	// Loot resources that killed enemies carried
	var cmpResourceGatherer = Engine.QueryInterface(targetEntity, IID_ResourceGatherer);
	if (cmpResourceGatherer)
		for (let resource of cmpResourceGatherer.GetCarryingStatus())
			resources[resource.type] += resource.amount;

	// Loot resources traders carry
	var cmpTrader = Engine.QueryInterface(targetEntity, IID_Trader);
	if (cmpTrader)
	{
		let carriedGoods = cmpTrader.GetGoods();
		if (carriedGoods.amount)
		{
			resources[carriedGoods.type] +=
				+ (carriedGoods.amount.traderGain || 0)
				+ (carriedGoods.amount.market1Gain || 0)
				+ (carriedGoods.amount.market2Gain || 0);
		}
	}

	// Transfer resources
	var cmpPlayer = QueryOwnerInterface(this.entity);
	cmpPlayer.AddResources(resources);

	// Update statistics
	var cmpStatisticsTracker = QueryOwnerInterface(this.entity, IID_StatisticsTracker);
	if (cmpStatisticsTracker)
		cmpStatisticsTracker.IncreaseLootCollectedCounter(resources);
};

Engine.RegisterComponentType(IID_Looter, "Looter", Looter);