Punkt in Blick- (Bau-) richtung einer Entity

Robert

Diese Funktion gibt den den Punkt zurück der im gewählten relativen Abstand zu einer Entity ist.

Die Parameter (_entity, _range[, _currPos])

_entity  : Ist die Person, Gebäude zu deren Blickrichtung ein Punkt erwünscht ist. 
_range   : Ist die Entfernung 
_currPos : Die Position auf der man sich befindet.

Rückgabe ist der Punkt. Siehe Anwendungsbeispiel.

function ZurEntity(_entity, _range, _currPos) 
	if type (_entity) == "table" then 
		Message("Keine Position sondern Entity angeben")  -- ein Punkt hat keine Blickrichtung
		return nil
	end
	if type (_entity) == "string" then
		_entity = GetEntityId(_entity);
	end
	local tPos = GetPosition(_entity)
	if _currPos == nil then 
		_currPos = tPos
	elseif type (_currPos) == "string" or type (_currPos) == "number"  then
		_currPos = GetPosition(_currPos)
	end
	local nEntityAngle=Logic.GetEntityOrientation(_entity);
	local nSin=math.sin((math.rad(nEntityAngle)));
	local nCos=math.cos((math.rad(nEntityAngle)));
	local tPos = GetPosition(_entity)
	return {X=_currPos.X-nCos*_range,Y=_currPos.Y-nSin*_range}; -- Rückgabe = neue Position
end

Anwendungsbeispiel und Erläuterung

  1. Einfachste Anwendung:
    Auf einem Punkt vor einem Bauernhof soll ein Serf erscheinen. Man hat aber keine ScriptEntity.
    CreateEntity(1, Entities.PU_Serf , ZurEntity("BauernHof_XYZ",-1500),"Serf1")

    Jetzt erscheint ein Serf im Abstand von 1500 in der Mitte vor dem Bauernhof. Egal wie der Bauernhof steht.

  2. Mit allen Parametern:
    Ein Serf soll von seiner jetztigen Position aus (er kann ja rechts oder links stehen) zum gewünschten Abstand vom Bauernhof laufen. Nehmen wir jetzt die erste Variante, dann läuft er im Abstand zum Bauernhof aber genau in der Mitte. Das wollen wir aber nicht. Also:
    Move ("Serf1", ZurEntity("BauernHof_XYZ",-1500,"Serf1"))

    Jetzt läuft er zu dem Punkt der 1500 vor dem Bauernhof ist, aber relativ von seiner Position.