Beitrag von Renz ()
Dieser Beitrag wurde von dennismitzwein aus folgendem Grund gelöscht: Spam ().
Hallo liebe Community
Ich habe mich da an etwas versucht, was eher eine spontane Idee war. Ich habe also den Scriptschnipsel auf ein paar Minuten schnell hingeklatscht, nun hänge ich aber seit Tagen an der Problemsuche. Villeicht kann mir hier einer helfen.
Ich möchte mir mit diesem Script einige Positionen auf der Map zeigen lassen. Diese Positionen werden von mir vorher mit einem Textbind in eine TXT-Datei geschrieben. Diese Liste wird wärend dem Spielverlauf ständig erweitert, desswegen lege ich keine festen Positionen direkt im Script fest.
Das Problem ist nun, dass die Texte, also das rote X das mit TextCreate erstellt wurde, dauerhaft wild blinkt, sobald mehrere Koordinaten in der TXT-Datei stehen. Das zuletzt hinzugefügte blinkt aber nicht.
So sieht mein Script dafür derzeit aus:
#Include API.ahk
XText := -1
Settimer, Timer, 1
:?:/add::
KeyWait, Enter
GetPlayerPosition(x, y, z, r)
PlayerPostion := "added, " x ", " y ", " z
AddChatMessage(0x3399FF, "Keybinder-Info {C0C0C0}| {FFFFFF}Erfolgreich hinzugefügt.")
FileAppend, %PlayerPostion%`n, Datei.txt
return
Timer:
Loop, read, Datei.txt
{
StringSplit, Koordinaten, A_LoopReadLine, `,
if(IsPlayerInRangeOfPoint(Koordinaten2, Koordinaten3, Koordinaten4, 300))
{
if(XText == -1)
XText := TextCreate("Arial", 10, false, false, -1, -1, 0xFFFF0000, "X", true, true)
if(XText == -1)
return
if(WorldToScreen(Koordinaten2, Koordinaten3, Koordinaten4, x, y)) {
if(TextSetPos(XText, x, y) == 0) {
TextDestroy(XText)
XText := -1
}
}
}
else
{
TextDestroy(XText)
XText:= -1
}
}
return
Alles anzeigen
Du erstellst viele overlays, aber hast nur eine variable für die overlay id
Ja okey... aber wie soll man das anders umsetzen?
MIr fällt nur ein, für jede Koordinate eine ID festlegen, dann ist das ganze aber nicht mehr dynamisch.
Ja okey... aber wie soll man das anders umsetzen?
MIr fällt nur ein, für jede Koordinate eine ID festlegen, dann ist das ganze aber nicht mehr dynamisch.
Ich würde es so machen, dass beim Starten deines Scriptes die Datei mit den Positionen ausgelesen wird.
Jede Position wird dann mit einer fortlaufenden ID und einem Status versehen, in ein Objekt eingefügt und dies wiederum in ein Array abspeichern.
Dieser Array wird deine Grundlage für dein Timer sein.
Einfach mit einer for-Schleife den Array durchlaufen und bei jedem wo der Status auf 0 ist, benutzt du TextCreate und setzt den Status auf 1.
Wenn der Status schon auf 1 ist, einfach die Position updaten.
MfG
Ich würde es so machen, dass beim Starten deines Scriptes die Datei mit den Positionen ausgelesen wird.
Jede Position wird dann mit einer fortlaufenden ID und einem Status versehen
Das hab ich jetzt mal folgendermaßen umgesetzt:
Loop, read, Datei.txt
{
StringSplit, Koordinaten%a_index%, A_LoopReadLine, `,
Overlay%a_index% := -1
}
Settimer, Timer, 1
Wie ich den Rest umsetzen soll, hab ich keine Ahnung. Verstehe das auch nicht so ganz was du damit meinst:
in ein Objekt eingefügt und dies wiederum in ein Array abspeichern.
Schick bitte mal den Inhalt mit der Datei.txt, mit einer Position.
MfG
Zitat von Deweyin ein Objekt eingefügt und dies wiederum in ein Array abspeichern. Dieser Array wird deine Grundlage für dein Timer sein. Einfach mit einer for-Schleife den Array durchlaufen
Den Teil hab ich nicht verstanden, kannst du mir das anders erklären oder ein Scriptbeispiel geben?
Sieht aktuell so aus:
global Positions_O := []
global PositionCount := 0
if(FileExist("Positions.ini")){
IniRead, PositionCount_Rout, Positions.ini, Information, Count
PositionCount := PositionCount_Rout
Loop, %PositionCount%
{
IniRead, TEXT_%A_Index%, Positions.ini, Position_%A_Index%, Text
IniRead, XPOS_%A_Index%, Positions.ini, Position_%A_Index%, X
IniRead, YPOS_%A_Index%, Positions.ini, Position_%A_Index%, Y
IniRead, ZPOS_%A_Index%, Positions.ini, Position_%A_Index%, Z
Positions_O.Push(Object("Text", TEXT_%A_Index%, "Position", A_Index, "XPOS", XPOS_%A_Index%, "YPOS", YPOS_%A_Index%, "ZPOS", ZPOS_%A_Index%))
createPositionText(TEXT_%A_Index%, A_Index, XPOS_%A_Index%, YPOS_%A_Index%, ZPOS_%A_Index%)
}
SetTimer, Update, 500
} else {
IniWrite, 0, Positions.ini, Information, Count
SetTimer, Update, 500
}
addPosition(Text, XPOS, YPOS, ZPOS){
PositionCount++
addchatmessage(-1, "coundding: " PositionCount)
IniWrite, %Text%, Positions.ini, Position_%PositionCount%, Text
IniWrite, %PositionCount%, Positions.ini, Information, Count
IniWrite, %XPOS%, Positions.ini, Position_%PositionCount%, X
IniWrite, %YPOS%, Positions.ini, Position_%PositionCount%, Y
IniWrite, %ZPOS%, Positions.ini, Position_%PositionCount%, Z
Positions_O.Push(Object("Text", Text, "Position", PositionCount, "XPOS", XPOS, "YPOS", YPOS, "ZPOS", ZPOS))
createPositionText(Text, PositionCount, XPOS, YPOS, ZPOS)
return
}
createPositionText(Text, Count, XPOS, YPOS, ZPOS){
WTS := worldToScreen(XPOS, YPOS, ZPOS)
px1 := WTS[1] / (1920 / 800)
px2 := WTS[2] / (1080 / 600)
Position_Text_%Count% := TextCreate("Geneva", 7, 1, 0, px1, px2, 0xFFFFFFFF, "", 1, 1)
TextSetString(Position_Text_%Count%, Text)
}
Update:
for i, o in Positions_O {
Position_Count := o.Position
addchatmessage(-1, o.Text " Count: " Position_Count)
WTS := worldToScreen(o.XPOS, o.YPOS, o.ZPOS)
px1 := WTS[1] / (1920 / 800)
px2 := WTS[2] / (1080 / 600)
TextSetPos(Position_Text_%Position_Count%, px1, px2)
}
return
/*
Numpad0::
;addchatmessage(-1, PositionCount)
addPosition("asd", 1786.3899, -1885.8046, 13.3940)
return
*/
Alles anzeigen
Der Text von einer Position wird erstellt.
Buggt noch. Mache morgen weiter.
MfG
Der Text soll ja nur ein X sein um die Position zu markieren und mit WorldToScreen soll sich dieses X mitdrehen wenn ich in in der Nähe bin, also mit IsPlayerInRangeOfPoint.
Gibts schon was neues?
Ich bin leider unter der Woche nur kurz Home. Bin tagsüber in der Berufsschule.
Der Fehler wird mit Sicherheit an der Variable "Position_Text_%Position_Count%" liegen.
Entweder wird die falsch erstellt/gespeichert. Habe keine Zeit das am PC zu testen, kann mir nur den Quellcode anschauen.
Vielleicht kann ja jemand anderes helfen.
MfG
Beim Start des Scriptes klappt das erstellen des Overlays nur manchmal. Auserdem verschiebt sich das Overlay nicht wenn ich mich bewege, liegt wohl daran das die Funktion WorldToScreen fehlende Parameter hat und sobald ich eine zweite Position speichere hat es die selbe OverlayID.
Und es verschwindet auch nicht wenn ich mich von der Position entferne, da ja auch das IsPlayerInRangeOfPoint fehlt.
Ganz komisch ist auch, wenn ich mich einmal um 180 Grad drehe wird das Overlay dort wie gespiegelt angezeigt.
@Dewey:
Ich hab alles mögliche versucht, aber dein Script überfordert mich. Kannst du da nochmal drüberschauen und nach Fehlern suchen? Wäre nett.
Alles anzeigenBeim Start des Scriptes klappt das erstellen des Overlays nur manchmal. Auserdem verschiebt sich das Overlay nicht wenn ich mich bewege, liegt wohl daran das die Funktion WorldToScreen fehlende Parameter hat und sobald ich eine zweite Position speichere hat es die selbe OverlayID.
Und es verschwindet auch nicht wenn ich mich von der Position entferne, da ja auch das IsPlayerInRangeOfPoint fehlt.
Ganz komisch ist auch, wenn ich mich einmal um 180 Grad drehe wird das Overlay dort wie gespiegelt angezeigt.
@Dewey:
Ich hab alles mögliche versucht, aber dein Script überfordert mich. Kannst du da nochmal drüberschauen und nach Fehlern suchen? Wäre nett.
Ich hab wieder ein bisschen mehr Zeit und Motivation daran zu arbeiten.
Werde allerspätestens nächstes Wochenende bestimmt damit fertig sein.
EDIT:
Hat doch weniger Zeit in Anspruch genommen, als gedacht. So sieht es jetzt aus:
SetParam("use_window", "1")
;SetParam musste ich zensieren
DestroyAllVisual()
global Positions_O := []
global PositionCount := 0
global TimerStarted := 0
global Radius := 30
if(FileExist("Positions.ini")){
IniRead, PositionCount_Rout, Positions.ini, Information, Count
PositionCount := PositionCount_Rout
if(PositionCount >= 1){
Loop, %PositionCount%
{
IniRead, TEXT_%A_Index%, Positions.ini, Position_%A_Index%, Text
IniRead, XPOS_%A_Index%, Positions.ini, Position_%A_Index%, X
IniRead, YPOS_%A_Index%, Positions.ini, Position_%A_Index%, Y
IniRead, ZPOS_%A_Index%, Positions.ini, Position_%A_Index%, Z
Positions_O.Push(Object("Text", TEXT_%A_Index%, "Count", A_Index, "XPOS", XPOS_%A_Index%, "YPOS", YPOS_%A_Index%, "ZPOS", ZPOS_%A_Index%, "Visible", 1))
createPositionText(TEXT_%A_Index%, A_Index, XPOS_%A_Index%, YPOS_%A_Index%, ZPOS_%A_Index%)
}
SetTimer, Update, 20
TimerStarted := 1
} else {
addChatMessage(-1, "Es konnte keine Position ausgelesen werden.")
addChatMessage(-1, "Es wird darauf gewartet, dass die Funktion addPosition() aufgerufen wird.")
}
} else {
IniWrite, 0, Positions.ini, Information, Count
addChatMessage(-1, "Es konnte keine Position ausgelesen werden.")
addChatMessage(-1, "Es wird darauf gewartet, dass die Funktion addPosition() aufgerufen wird.")
}
addPosition(Text, XPOS, YPOS, ZPOS){
PositionCount++
IniWrite, %Text%, Positions.ini, Position_%PositionCount%, Text
IniWrite, %PositionCount%, Positions.ini, Information, Count
IniWrite, %XPOS%, Positions.ini, Position_%PositionCount%, X
IniWrite, %YPOS%, Positions.ini, Position_%PositionCount%, Y
IniWrite, %ZPOS%, Positions.ini, Position_%PositionCount%, Z
Positions_O.Push(Object("Text", Text, "Count", PositionCount, "XPOS", XPOS, "YPOS", YPOS, "ZPOS", ZPOS, "Visible", 1))
createPositionText(Text, PositionCount, XPOS, YPOS, ZPOS)
if(!TimerStarted){
TimerStarted := 1
SetTimer, Update, 20
}
return
}
areCordsOnScreen(X, Y){
if(X > 0 && X < 800 && Y > 0 && Y < 600){
return true
} else {
return false
}
}
createPositionText(Text, Count, XPOS, YPOS, ZPOS){
global
WTS := worldToScreen(XPOS, YPOS, ZPOS)
px1 := WTS[1] / (1920 / 800)
px2 := WTS[2] / (1080 / 600)
Position_Text_%Count% := TextCreate("Geneva", 7, 1, 0, px1, px2, 0xFFFFFFFF, "", 1, 1)
TextSetString(Position_Text_%Count%, Text)
}
Update:
for i, o in Positions_O {
curr_pos := o.Count
WTS := worldToScreen(o.XPOS, o.YPOS, o.ZPOS)
px1 := WTS[1] / (1920 / 800)
px2 := WTS[2] / (1080 / 600)
if(!areCordsOnScreen(px1, px2) || !isPlayerInRangeOfPoint(o.XPOS, o.YPOS, o.ZPOS, Radius)){
if(o.Visible == 1){
TextSetShown(Position_Text_%curr_pos%, 0)
o.Visible := 0
continue
}
continue
}
if(!o.Visible){
TextSetShown(Position_Text_%curr_pos%, 1)
o.Visible := 1
}
TextSetPos(Position_Text_%curr_pos%, px1, px2)
}
return
Numpad0::
addPosition("Neu", 1783.3811, -1908.6150, 13.3918)
return
Alles anzeigen
[Information]
Count=2
[Position_1]
Text=huib
X=1772.5023
Y=-1894.7751
Z=13.3940
[Position_2]
Text=asd
X=1786.3899
Y=-1885.8046
Z=13.3940
Alles anzeigen
Kannst meine Koordinaten nehmen.
Wenn du das Script startest und die Taste Numpad0 drückst, sollte eigentlich eine neue Position erstellt werden.
Alle diese Positionen hab ich auf dem Server wo du spielst (Another-Life) am Neulingsspawn getestet.
Der Radius, wann du einen Text siehst, ist in der Variable "Radius" festgelegt.
P.S: Musste die Funktion SetParam rausnehmen, weil die Parameter zensiert werden.
@seegras oder ein anderes Teammitglied, warum muss ich das:
wegen dem hier zensieren?:
Einfach nachfragen, wenn etwas unverständlich ist, oder du Probleme bei irgendwas hast.
MfG
Folgende Probleme hab ich noch:
Und eine kleine Frage hab ich noch, welche nun eigentlich völlig unabhängig von diesem Script ist:
Die API-Funktion IfIsPlayerInRangeOfPoint nutzt ja eine Range, was also eine Distanz zu einem Punkt bedeutet. Das bedeutet doch es müsste theoretisch möglich sein, sich die Distanz zu einem Punkt auch einfach als Zahl ausgeben zu lassen. Egal wie.. ich möchte die Distanz zu einem beliebigen Punkt nur einfach als Zahl ausgeben.
Folgende Probleme hab ich noch:
- Du schreibst im Code SetParam("use_window", "GTA:SA:MP") und im Screenshot unten schreibst du nur window statt use_window. Was ist denn nun korrekt?
- Beim ausführen des Scripts erhalte ich die Fehlermeldung ==> Too few parameters passed to function. Specifically: worldToScreen(XPOS, YPOS, ZPOS). In der API die ich verwende wäre die Funktion korrekt aufgebaut folgendermaßen WorldToScreen(XPos,YPos,ZPos, x, y). Ich gehe mal davon aus, dass die beiden fehlenden Parameter px1 und px2 sein werden, liege ich da richtig?
- Im Spiel ist garnichts zu sehen, obwohl ich deine Koordinaten in die Positions.ini kopiert habe. Den Radius hab ich auch schon vergrößert, aber es wird einfach keine Position angezeigt. Das Script funktioniert aber, denn die NumPad0 funktioniert, aber sonst wird nichts angezeigt.
Und eine kleine Frage hab ich noch, welche nun eigentlich völlig unabhängig von diesem Script ist:
Die API-Funktion IfIsPlayerInRangeOfPoint nutzt ja eine Range, was also eine Distanz zu einem Punkt bedeutet. Das bedeutet doch es müsste theoretisch möglich sein, sich die Distanz zu einem Punkt auch einfach als Zahl ausgeben zu lassen. Egal wie.. ich möchte die Distanz zu einem beliebigen Punkt nur einfach als Zahl ausgeben.
Du könntest ja die IsPlayerInRangeOfPoint Funktion einfach editieren. Allerdings bringt die SAMP UDF auch die Funktion getDist mit, welche die Distanz zwischen zwei Punkten (Parameter als Float-Arrays) im dreidimensionalen Raum berechnet.
Folgende Probleme hab ich noch:
- Du schreibst im Code SetParam("use_window", "GTA:SA:MP") und im Screenshot unten schreibst du nur window statt use_window. Was ist denn nun korrekt?
- Beim ausführen des Scripts erhalte ich die Fehlermeldung ==> Too few parameters passed to function. Specifically: worldToScreen(XPOS, YPOS, ZPOS). In der API die ich verwende wäre die Funktion korrekt aufgebaut folgendermaßen WorldToScreen(XPos,YPos,ZPos, x, y). Ich gehe mal davon aus, dass die beiden fehlenden Parameter px1 und px2 sein werden, liege ich da richtig?
- Im Spiel ist garnichts zu sehen, obwohl ich deine Koordinaten in die Positions.ini kopiert habe. Den Radius hab ich auch schon vergrößert, aber es wird einfach keine Position angezeigt. Das Script funktioniert aber, denn die NumPad0 funktioniert, aber sonst wird nichts angezeigt.
Und eine kleine Frage hab ich noch, welche nun eigentlich völlig unabhängig von diesem Script ist:
Die API-Funktion IfIsPlayerInRangeOfPoint nutzt ja eine Range, was also eine Distanz zu einem Punkt bedeutet. Das bedeutet doch es müsste theoretisch möglich sein, sich die Distanz zu einem Punkt auch einfach als Zahl ausgeben zu lassen. Egal wie.. ich möchte die Distanz zu einem beliebigen Punkt nur einfach als Zahl ausgeben.
1. Ob nur der einmalige Aufruf der Funktion SetParam reicht, weiß ich nicht. Jedoch habe ich meine zwei Zeilen aus den Anwendungsbeispielen der Overlay-API.
*Klick Mich* Zeile 8 und 9.
2. Es hat schon seine Richtigkeit, wie ich es geschrieben habe. Ich weiß nicht welche API du verwendest und was für Parameter für deine WorldToScreen-Funktion benötigt werden. Aber so sieht meine Funktion aus (mit der SAMP-UDF kompatibel):
global WORLD_TO_SCREEN_MATRIX := 0xB6FA2C
global WORLD_VIRTUAL_SCREEN_SIZE_X := 0xC17044
global WORLD_VIRTUAL_SCREEN_SIZE_Y := 0xC17048
worldToScreen(fX, fY, fZ) {
if(!checkHandles())
return false
m_11 := readFloat(hGTA, WORLD_TO_SCREEN_MATRIX + 0*4)
if(ErrorLevel) {
ErrorLevel := ERROR_READ_MEMORY
return false
}
m_12 := readFloat(hGTA, WORLD_TO_SCREEN_MATRIX + 1*4)
m_13 := readFloat(hGTA, WORLD_TO_SCREEN_MATRIX + 2*4)
m_21 := readFloat(hGTA, WORLD_TO_SCREEN_MATRIX + 4*4)
m_22 := readFloat(hGTA, WORLD_TO_SCREEN_MATRIX + 5*4)
m_23 := readFloat(hGTA, WORLD_TO_SCREEN_MATRIX + 6*4)
m_31 := readFloat(hGTA, WORLD_TO_SCREEN_MATRIX + 8*4)
m_32 := readFloat(hGTA, WORLD_TO_SCREEN_MATRIX + 9*4)
m_33 := readFloat(hGTA, WORLD_TO_SCREEN_MATRIX + 10*4)
m_41 := readFloat(hGTA, WORLD_TO_SCREEN_MATRIX + 12*4)
m_42 := readFloat(hGTA, WORLD_TO_SCREEN_MATRIX + 13*4)
m_43 := readFloat(hGTA, WORLD_TO_SCREEN_MATRIX + 14*4)
dwLenX := readDWORD(hGTA, WORLD_VIRTUAL_SCREEN_SIZE_X)
if(ErrorLevel) {
ErrorLevel := ERROR_READ_MEMORY
return false
}
dwLenY := readDWORD(hGTA, WORLD_VIRTUAL_SCREEN_SIZE_Y)
frX := fZ * m_31 + fY * m_21 + fX * m_11 + m_41
frY := fZ * m_32 + fY * m_22 + fX * m_12 + m_42
frZ := fZ * m_33 + fY * m_23 + fX * m_13 + m_43
fRecip := 1.0/frZ
frX *= fRecip * dwLenX
frY *= fRecip * dwLenY
if(frX<=dwLenX && frY<=dwLenY && frZ>1)
return [frX,frY,frZ]
}
Alles anzeigen
Wenn du diese Funktion benutzt, sollte auch die Fehlermeldung verschwinden.
3. Liegt wahrscheinlich an Punkt 1 oder 2. Wenn du die beiden Punkte behoben hast und es immer noch nicht funktioniert, einfach melden.
4. Eine Funktion um eine Distanz zwischen zwei Koordinaten zu errechnen existiert ebenfalls in der SAMP-UDF (getDist() heißt die Funktion).
Hier der Auszug aus der SAMP-UDF:
getDist(pos1,pos2) {
if(!pos1 || !pos2)
return 0
return Sqrt((pos1[1]-pos2[1])*(pos1[1]-pos2[1])+(pos1[2]-pos2[2])*(pos1[2]-pos2[2])+(pos1[3]-pos2[3])*(pos1[3]-pos2[3]))
}
Beachte hierbei, dass pos1 und pos2 ein Objekt übergeben werden muss. Sollte folgendermaßen aussehen:
MfG
Kein Problem
Habe vorausgesetzt, dass du dich schon mal mit der Overlay-API auseinander gesetzt hast.
https://github.com/agrippa1994/DX9-Overlay-API
Aus dem Ordner "bin" die dx9_overlay.dll und dem Ordner "Include/ahk" die overlay.ahk.
Beide mit deinem Script, der SAMP-UDF usw. in einen Ordner und die 3. Zeile in der overlay.ahk auf folgenden Inhalt ändern:
MfG
Ich hab das mal versucht, aber irgendwie kommt immer 0 dabei raus.
Eine der beiden Positionen soll GetPlayerPos sein und die andere soll entweder eine feste Position oder ebenfalls eine andere dynamische Position sein.
NumPad5::
GetPlayerPos(PlayerX, PlayerY, PlayerZ)
pos1 = PlayerX, PlayerY, PlayerZ
X := 1769.836060
Y := -1914.484131
Z := 14.157948
pos2 = X, Y, Z
Distanz := getDist(pos1, pos2)
AddChatMessage(Distanz)
return
;oder
NumPad5::
GetPlayerPos(PlayerX, PlayerY, PlayerZ)
pos1 = [PlayerX, PlayerY, PlayerZ]
pos2 = [1769.836060, -1914.484131, 14.157948]
Distanz := getDist(pos1, pos2)
AddChatMessage(Distanz)
return
Alles anzeigen
//Edit: Den oberen Fehler hab ich nun selbst gefunden. Es fehlte in Zeile 3 und 7 lediglich der Doppelpunkt vor dem =. Wie blind man doch manchmal ist xD
Das nachfolgende würde ich trotzdem gerne wissen.
Ich würde gerne mit einem Textbind alle Positionen ausblenden. Wenn ich den Textbind erneut verwende, sollen wieder alle Positionen sichtbar sein. Folgendermaßen würde ich das jetzt umsetzen,
:?:/pause::
if(pause == 1){
pause := 0
return
}
if(pause == 0){
pause := 1
return
}
Update:
if(pause == 1)
Loop, %PositionCount%
{
TextDestroy(Position_Text_%Count%)
}
if(pause == 0)
for i, o in Positions_O {
curr_pos := o.Count
WTS := worldToScreen(o.XPOS, o.YPOS, o.ZPOS)
px1 := WTS[1] / (1920 / 800)
px2 := WTS[2] / (1080 / 600)
if(!areCordsOnScreen(px1, px2) || !isPlayerInRangeOfPoint(o.XPOS, o.YPOS, o.ZPOS, Radius)){
if(o.Visible == 1){
TextSetShown(Position_Text_%curr_pos%, 0)
o.Visible := 0
continue
}
continue
}
if(!o.Visible){
TextSetShown(Position_Text_%curr_pos%, 1)
o.Visible := 1
}
TextSetPos(Position_Text_%curr_pos%, px1, px2)
pos1 := GetPlayerPos(PlayerX, PlayerY, PlayerZ)
px3 := "13"
pos2 = %px1% ", " %px2% ", " %px3%
Distanz := getDist(pos1, pos2)
TextSetString(Position_Text_%curr_pos%, "{FF0000}Graffiti`n000m")
}
return
Alles anzeigen