SCV Funktionen
» Siedler Map Source Forum » Siedler DEdK Script Forum » SCV Funktionen
Seiten: 1
Kantelo
|
#1 30.05.2014 21:32 Beiträge: 357 |
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: 704 |
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
Siedler DEdK Mapping + Scripting Tutorials
AdeBont
|
#3 31.05.2014 00:25 Beiträge: 666 |
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: 2123 |
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...
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
Play4FuN
|
#5 31.05.2014 10:21 Beiträge: 704 |
@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
Siedler DEdK Mapping + Scripting Tutorials
totalwarANGEL
|
#6 31.05.2014 13:07 Beiträge: 2123 |
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.
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
mcb
|
#7 31.05.2014 13:30 Beiträge: 1472 |
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: 2123 |
Moveziele muss ich nicht damit auslesen. AeK hat ein GameCallback dafür... Trotzdem danke.
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
Kantelo
|
#9 21.08.2014 21:39 Beiträge: 357 |
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: 243 |
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?
____________________
Wenn die KI immer frontal angreift, wofür steht dann Das I in Künstliche Intelligenz?
Das neueste vom Nebelvolk!
totalwarANGEL
|
#12 27.09.2015 18:49 Beiträge: 2123 |
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.
____________________
Die Welt ist arschlochförmig und wir leben in der Mitte.
mcb
|
#13 27.09.2015 19:26 Beiträge: 1472 |
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