SCV Funktionen

» Siedler Map Source Forum » Siedler DEdK Script Forum » SCV Funktionen

Seiten: 1

Kantelo
#1
30.05.2014 21:32
Beiträge: 356

SCV Funktionen

Hallo zusammen,
ich habe in den letzten Wochen noch einige Sachen zu den Scripting Values herausgefunden.
Deswegen habe ich beschlossen eine Comfortsammlung anzulegen zu den Scriptingvalues mit dem, was für einen Mapper nützlich sein könnte und was man nicht schon über Logic Funktionen machen kann.
Die Funktionen sind zum größten Teil selbsterklärend, ich habe auch immer noch ein bisschen was dazugeschrieben.
Das, was zum Absturz führen kann habe ich auch reingeschrieben, trotzdem ist das ganze noch nicht vollständig auf Speicherfestigkeit etc. getestet, ich habe bei den meisten Sachen aber keine Bedenken.
Wichtig bei einigen Sachen ist, dass sie nicht im gleichen Moment aufgerufen werden indem die Entity erstellt wird; auch nicht in der FMA.
Meistens werden die Konvertierungsfunktionen von bobby (Int2Float und Float2Int) benötigt; auch diese müssen an irgendeiner Stelle ins Skript kopiert werden, sonst funktioniert es nicht.
Link: http://www.b0bby.tk/downloads/scriptingvalues.lua

--+++++++++++++++++++++++++++++++++++++++SCV Funktionen++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++	
SCV = {}
--++++++++++++++++Für alle Entities++++++++++++++++++++++++++++++++++++++++++

-- gibt boolean zurück, ob Entity sichtbar ist, oder nicht
function SCV.IsVisible(_entity)
local id = GetEntityId(_entity)
if Logic.GetEntityScriptingValue(id,-30) == 257 then
return false
else
return true
end
end

-- Macht eine Entität unsichtbar/sichtbar
--Parameter1: Entity
--Parameter2: 1 = sichtbar; 0 = unsichtbar; ansonsten Hin und Herschalten
function SCV.SetVisible(_entity,_flag)
local id = GetEntityId(_entity)
if _flag == 0 then
Logic.SetEntityScriptingValue(id,-30,257)
elseif _flag == 1 then
Logic.SetEntityScriptingValue(id,-30,65537)
else
 if SCV.IsVisible(id) then
 Logic.SetEntityScriptingValue(id,-30,257)
 else
 Logic.SetEntityScriptingValue(id,-30,65537)
 end
end
end 

--Setzt die Gesundheitspunkte einer Entity
function SCV.SetAbsoluteHealth(_entity,_health) 
local id = GetEntityId(_entity)
Logic.SetEntityScriptingValue(id,-8,_health)
end

-- Skaliert eine Entity 
--Parameter1: Entity
--Parameter2: Skalierung (1=Normalgröße; <1 = kleiner; >1 = größer)
function SCV.SetScale(_entity,_scale)
local id = GetEntityId(_entity)
Logic.SetEntityScriptingValue(id,-33,Float2Int(_scale))
end

-- Gibt die Skalierung einer Entity zurück 
--Parameter1: Entity
--Rückgabe: Skalierung
function SCV.GetScale(_entity)
local id = GetEntityId(_entity)
return Int2Float(Logic.GetEntityScriptingValue(id,-33))
end

--Setzt den Entity Typ (Vorsicht: Einheit nur durch Einheit ersetzen, Gebäude nur durch Gebäude, Resource nur durch Resource und Doodad nur durch Doodad!!!!)
function SCV.SetEntityType(_entity,_entityType)
local id = GetEntityId(_entity)
Logic.SetEntityScriptingValue(id,-54,_entityType)
end

--++++++++++++++++Nur für Resourcen Entities++++++++++++++++++++++++++++++++++++++++++

--Gibt den Resourcen Typ einer Resourcen Entity zurück
function SCV.GetResourceType(_entity)
local id = GetEntityId(_entity)
return Logic.GetEntityScriptingValue(id,8)
end

--Setzt den Resourcen Typ einer Resourcen Entity
function SCV.SetResourceType(_entity,_type)
local id = GetEntityId(_entity)
Logic.SetEntityScriptingValue(id,8,_type)
end

--++++++++++++++++Nur für Gebäude++++++++++++++++++++++++++++++++++++++++++

--Gibt die Höhe eines Gebäudes, ausgehend von der Normalposition 1 (2= Gebäude ist auf doppelter Höhe) zurück
function SCV.GetBuildingRelativeHeight(_entity) 
local id = GetEntityId(_entity)
return Int2Float(Logic.GetEntityScriptingValue(id,18))
end

--Setzt die Höhe eines Gebäudes, ausgehend von der Normalposition 1 (2= Gebäude ist auf doppelter Höhe)
function SCV.SetBuildingRelativeHeight(_entity,_height) 
local id = GetEntityId(_entity)
Logic.SetEntityScriptingValue(id,18,Float2Int(_height))
end

--++++++++++++++++Nur für Einheiten++++++++++++++++++++++++++++++++++++++++++

-- Parameter: _entity 
-- Rückgabe: Detaillierte Erfahrungspunkte (Soldat besiegt = + 20; Hauptmann besiegt = + 30; Upgrade auf neues Erfahrungslevel so ungefähr bei: 200,325,475,625,850 
--           Wenn Erfahrungssystem deaktiviert, dann Rückgabe -1
function SCV.GetEntityDetailledExpPoints(_entity)
local id = GetEntityId(_entity)
return Int2Float(Logic.GetEntityScriptingValue(id,27))
end

-- Gleicht die Erfahrungspunkte von Entity1, den Erfahrungspunkten von Entity2 an; Vorraussetzung: Erfahrungssystem muss aktiviert sein; Einheit muss Militär oder Held sein. 
-- Nebenwirkung: Bei dem Darüberfahren mit der Maus über die erste Entity wird bei dieser keine Mausinfo angezeigt, dafür aber bei der zweiten Entity; 
-- Soldatenanzeige wird übernommen, diese kann aber bei Helden mit SCV.SetMaximumSoldierWidget versteckt werden.
-- Parameter1: Entity1  
-- Parameter2: Entity2 
function SCV.AssimilateExperiencePoints(_entity1,_entity2) 
local id1 = GetEntityId(_entity1)
local id2 = GetEntityId(_entity2)
local data = Logic.GetEntityScriptingValue(id2,70)
Logic.SetEntityScriptingValue(id1,68,data)
end

-- Macht die Angleichung der Experience Points Rückgängig
-- Parameter: Entity
function SCV.ReturnToOwnExperiencePoints(_entity) 
local id = GetEntityId(_entity)
local data = Logic.GetEntityScriptingValue(id,70)
Logic.SetEntityScriptingValue(id,68,data)
end

--Gleicht die Overhead Healthbar von Entity1, der Healthbar von Entity2 an; Nur dann möglich, wenn Einheit normalerweise auch eine Healthbar hat: 
-- Parameter1: Entity1  
-- Parameter2: Entity2 
function SCV.AssimilateHealthbar(_entity1,_entity2) 
local id1 = GetEntityId(_entity1)
local id2 = GetEntityId(_entity2)
local data = Logic.GetEntityScriptingValue(id2,70)
Logic.SetEntityScriptingValue(id1,67,data)
end

-- Macht die Angleichung der Healthbar Rückgängig
-- Parameter: Entity
function SCV.ReturnToOwnHealthbar(_entity) 
local id = GetEntityId(_entity)
local data = Logic.GetEntityScriptingValue(id,70)
Logic.SetEntityScriptingValue(id,67,data)
end

-- Setzt das Maximum-Soldier Widget; Möglich ist das nur für Helden!
--Parameter1: Entity
--Parameter2: maximale Anzahl an Soldaten
function SCV.SetMaximumSoldierWidget(_entity,_maxNumberOfSoldiers)
local id = GetEntityId(_entity)
Logic.SetEntityScriptingValue(id,43,Float2Int(_maxNumberOfSoldiers))
end

-- Setzt das Current-Soldier Widget (blau gefärbte Punkte im Maximum-Soldier Widget; Möglich ist das nur für Helden!
--Parameter1: entity
--Parameter2: Anzahl an Soldaten
function SCV.SetCurrentSoldierWidget(_entity,_currentNumberOfSoldiers)
local id = GetEntityId(_entity)
Logic.SetEntityScriptingValue(id,41,Float2Int_currentNumberOfSoldiers())
end

-- Setzt das Overhead Widget 
--Parameter1: entity
--Parameter2: Flag: 
--            0 = Nur der Name wird angezeigt
--            1 = Name und Healthbar werden angezeigt (auch bei Einheiten, bei denen der Name normalerweise nicht darübersteht!!)
--            2 = Worker Widget wird angezeigt
--            3 = Name und Healthbar werden angezeigt; normal für Helden und Hauptmänner (Nur für diese benutzen; Sonst ==> Absturz!)
--            4 = Nichts; normal für Soldaten 
function SCV.SetEntityOverheadWidget(_entity,_flag) 
local id = GetEntityId(_entity)
Logic.SetEntityScriptingValue(id,72,_flag)
end

-- Setzt das Bonussystem für Erfahrungspunkte; geht für Militär und Helden
-- Mögliche Klassen: 
-- -1 = Deaktiviert für Helden/Leibeigene etc. 
-- 0 = experiencesword
-- 1 = experiencebow
-- 2 = experiencespear
-- 3 = experienceheavycavalry
-- 4 = experiencelightcavalry
-- 5 = experiencecannon (= nichts)
-- 6 = experiencerifle
function SCV.SetEntityExperienceClass(_entity,_class)
local id = GetEntityId(_entity)
Logic.SetEntityScriptingValue(id,73,_class)
end

-- Deaktiviert das Erfahrungssystem für eine Einheit
function SCV.DeactivateExperienceSystem(_entity)
local id = GetEntityId(_entity)
Logic.SetEntityScriptingValue(id,73,5)
end

-- Gibt die Zielkoordinaten eines Move Befehls zurück 
function SCV.GetEntityMoveDestination(_entity)
local id = GetEntityId(_entity)
return Int2Float(Logic.GetEntityScriptingValue(id,8)),Int2Float(Logic.GetEntityScriptingValue(id,9))
end

--Gibt den gerade laufenden Task der aktiven Task List zurück.
function SCV.GetTask(_entity)
local id = GetEntityId(_entity)
return Logic.GetEntityScriptingValue(id,-21)
end

--Setzt einen Task der gerade aktiven Task List; noch nicht genau erforscht; siehe Ergänzung.
function SCV.SetTask(_entity,_number)
local id = GetEntityId(_entity)
Logic.SetEntityScriptingValue(id,-21,_number)
end

--+++++++++++++++++++Diese Befehle geben nur etwas zurück wenn von dem Wert schon einmal Gebrauch gemacht worden ist; also z.B. GetHealingPoints gibt erst einen Wert zurück, wenn Einheit schon einmal verwundet wurde!

function SCV.GetEntityMaxAttackRange(_entity)
local id = GetEntityId(_entity)
return Int2Float(Logic.GetEntityScriptingValue(id,49))
end

function SCV.GetEntityHealingPoints(_entity)
local id = GetEntityId(_entity)
return Int2Float(Logic.GetEntityScriptingValue(id,53))
end

function SCV.GetEntityMissChance(_entity)
local id = GetEntityId(_entity)
return Int2Float(Logic.GetEntityScriptingValue(id,55))
end

function SCV.GetEntityDamageBonus(_entity)
local id = GetEntityId(_entity)
return Int2Float(Logic.GetEntityScriptingValue(id,45))
end

function SCV.GetEntityAutoAttackRange(_entity)
local id = GetEntityId(_entity)
return Int2Float(Logic.GetEntityScriptingValue(id,51))
end

function SCV.GetEntityMovingSpeed(_entity)
local id = GetEntityId(_entity)
return Int2Float(Logic.GetEntityScriptingValue(id,31))
end

--+++++++++++++++++++++++++++++++++++++++++++Sonstiges+++++++++++++++++++++++++

--[[ Erstellt ein XS_Ambient an einer bestimmten Position
Paramter1: AmbientTyp; möglich sind:
AS_Forest = 1
AS_UHU = 2
AS_Campfire = 3 
AS_ForestEuropeDayTime = 4 
AS_SwampFrogs = 5 
AS_WaterLakeShore = 6 
AS_WaterfallBig = 7 
AS_WindMountain = 8 
AS_WaterRiverSmall = 9 
AS_Crickets = 10
AS_Desertwind = 11
AS_Leaves = 12
AS_Moorbird = 13
AS_MoorBranches = 14 
AS_MoorBubbles = 15 
AS_FogPeopleDrums = 16
AS_ClickeringPebbles = 17 
AS_RushingWaterNormal = 18 
AS_RushingWaterDontFreeze = 19 
AS_Seagulls = 20
AS_Sheep = 21
AS_Wolves = 22

Parameter2: Position
Parameter3: Größe
Parameter4: Lautstärke (nach oben unbegrenzt; normal: volle Lautstärke = 100)
]]
function SCV.CreateAmbient(_type,_pos,_size,_volume)
local pos = GetPosition(_pos)
local ID = Logic.CreateEntity(Entities.XS_Ambient,pos.X,pos.Y,0,1)
Logic.SetEntityScriptingValue(ID,-33,Float2Int(_size))
Logic.SetEntityScriptingValue(ID,-8,_volume)
Logic.SetEntityScriptingValue(ID,9,_type)
return ID
end


Ergänzung (dafür habe ich keine Comfortfunktion geschrieben) :
-21 gibt an welcher Task einer Task List gerade ausgeführt wird. In Kombination mit anderen Werten, kann man die Animationen direkt beeinflussen. Genau habe ich das noch nicht erforscht; bis jetzt habe ich nur das hier herausgefunden:
Lässt eine Kampf-Einheit (in dem Fall "erec" ) in eine spezielle Verteidigungsposition gehen bis der Job beendet wird.

 
function Verteidigungsposition()
Logic.SetEntityScriptingValue(GetEntityId("erec"),-22,243)
Logic.SetEntityScriptingValue(GetEntityId("erec"),-24,20)
Logic.SetEntityScriptingValue(GetEntityId("erec"),-21,3)
Logic.SetEntityScriptingValue(GetEntityId("erec"),-21,6)
function BleibInPosition()
Logic.SetEntityScriptingValue(GetEntityId("erec"),-21,3)
end
BleibInPosition_Job = StartSimpleHiResJob("BleibInPosition")
end



Ich hoffe, dass ihr etwas davon brauchen könnt!
Wenn jemand noch etwas ergänzendes hinzufügen kann, gerne
Gruß
Kantelo

Wichtig!!!!
Einige Funktionen wirken erst dann, wenn man sie ein paar Sekunden nach Spielstart bzw. einige Sekunden nach dem erstellen der betreffenden Entity aufruft.

Dieser Beitrag wurde von Kantelo am 20.12.2014 um 16:11 editiert.

Play4FuN
#2
30.05.2014 22:35
Beiträge: 488

Danke :)

Wahnsinn, was per Veränderung der Scripting Values alles möglich ist - DANKE an die, die sich damit beschäftigen und uns das zur Verfügung stellen!!!

Mir selbst hat das u.a. weitergeholfen noch mehr schöne Dinge in neue Werke ein zu bauen. Vielen Dank nochmal!

____________________
LG Play4FuN

AdeBont
#3
31.05.2014 00:25
Beiträge: 662

Hi Kantelo

You also gave me this perfectly usable function to be run as SimpleHiResJob:

function DeerNotMoving()
local x,y = Logic.EntityGetPos(GetEntityId("deerPosition"))
Logic.SetEntityScriptingValue(GetEntityId("deer"),-36,Float2Int(x))
Logic.SetEntityScriptingValue(GetEntityId("deer"),-35,Float2Int(y))
Logic.SetEntityScriptingValue(GetEntityId("deer"),8,Float2Int(x))
Logic.SetEntityScriptingValue(GetEntityId("deer"),9,Float2Int(y))
end


Indeed like P4F stated, the Scriptingvalues trick has helped me also to get some things functional
that otherwise would have not been possible.
Many thanks!

____________________
AdB
---------------------------------
Now faith is the substance of things hoped for,
the evidence of things not seen.
Heb 11:1

totalwarANGEL
#4
31.05.2014 02:08
Beiträge: 2056

Super... Logic.SetVisible (AeK) habe ich bei DEdK vermisst, seit dem ich S6 kenne. Endlich haben wir auch sowas. Eröffnet mal wieder neue Wege...

____________________
Liebe ist wie ein Kopfschuss!

Play4FuN
#5
31.05.2014 10:21
Beiträge: 488

@twA:

Das ist genau DIE Funktion, auf die ich in erster Linie angespielt habe.
Feidliche Truppen können unsichtbare Einheiten blöderweise noch angreifen, aber ein netter Effekt ist es trotzdem. Ich denke mal, es ist sicher noch irgendwo gespeichert, ob eine Einheit gerade angegriffen werden kann oder unsichtbar ist. Bei Ari müssten sich also mehrere Werte ändern, sobald man sie unsichtbar werden lässt - mal testen ...

____________________
LG Play4FuN

totalwarANGEL
#6
31.05.2014 13:07
Beiträge: 2056

Zitat von Play4FuN:
@twA:

Das ist genau DIE Funktion, auf die ich in erster Linie angespielt habe.
Feidliche Truppen können unsichtbare Einheiten blöderweise noch angreifen, aber ein netter Effekt ist es trotzdem. Ich denke mal, es ist sicher noch irgendwo gespeichert, ob eine Einheit gerade angegriffen werden kann oder unsichtbar ist. Bei Ari müssten sich also mehrere Werte ändern, sobald man sie unsichtbar werden lässt - mal testen ...



Ich dachte da eher an die Befriedigung meiner Faulheitsgelüste. NPCs müssen nicht mehr per Skript erzeugt werden, sondern können von Anfang an dastehen, nur unsichtbar. Mach ich neuerdings gerne.

Ich find es nur schade, das keiner bei AeK selbige Funktion analysieren möchte. Wer weiß was man DA alles anstellen könnte... Ich hab leider nicht viel Ahnung davon wie man diese Slots sinnvoll analysiert. Ich hab nur rausgefunden, dass -71 (oder wars -72...) die PlayerID ist.

____________________
Liebe ist wie ein Kopfschuss!

mcb
#7
31.05.2014 13:30
Beiträge: 1314

Ich hab damit Darios Falken umgebaut

@twa: Einfach nen HiResJob, der alle Werte ausliest und dann mit denen vom letzten mal vergleichen. Solche sachen wie Move-Ziele müsstest du damit finden. Sonst hab ich leider keine Ahnung von AeK.

totalwarANGEL
#8
31.05.2014 14:29
Beiträge: 2056

Moveziele muss ich nicht damit auslesen. AeK hat ein GameCallback dafür... Trotzdem danke.

____________________
Liebe ist wie ein Kopfschuss!

Kantelo
#9
21.08.2014 21:39
Beiträge: 356

Wichtig

Es gibt einige Funktionen, die erst ein paar Sekunden nach dem Erstellen der betreffenden Entity richtig funktionieren.
Vor allem das Verändern aller Overhead-Widgets und das Erfahrungssystem Zeug gehören dazu.

Ich werde, sobald ich mehr Zeit habe die Funktionen noch einmal überarbeiten; das mit dem Soldier Widget bekomme ich gerade selbst nicht mehr hin

castleplayer
#10
29.03.2015 14:18
Beiträge: 242

Namen ändern

Ist es mit den SCV irgendwie möglich den Namen der über den Gebäuden im Spiel angezeigt wird (also nicht der im Fensterchen unten rechts) ändern?

____________________
LG castleplayer
_______________
Wenn die KI immer frontal angreift, wofür steht dann Das I in Künstliche Intelligenz?
Das neueste vom Nebelvolk!

mcb
#11
29.03.2015 14:25
Beiträge: 1314

Nein, aber mit dem S5Hook ist es möglich.

totalwarANGEL
#12
27.09.2015 18:49
Beiträge: 2056

Overhead-Widgets

Wie war das noch mal? Man kann bestimmte Dinge im Overhead-Widget von Helden verändern. Kann man auch nur den Text ausblenden, sodass kein Name da steht, aber der Lebensbalken noch da ist?

Der Zweck möge einleuchten: Wenn ich meinen Helden "Conan, der Barbar" nennen wöllte, würde es stören, wenn da noch immer "Pilgrim" steht.



Hinweis: Ich arbeite noch immer mit der alten Version von SCV.

____________________
Liebe ist wie ein Kopfschuss!

mcb
#13
27.09.2015 19:26
Beiträge: 1314

Nicht per SCV, soweit ich weiß. Du könntest aber über S5Hook.SetCustomNames einen Leerstring setzen. (Ich würd dann allerdings gleich "Conan" drüberschreiben )

Seiten: 1

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum