Mal ein paar generelle Tipps:
- #pragma tabsize 0 gehört wie goto zu den "verbotenen" Keywords. Wer sowas verwendet sorgt dafür, dass der Code komplett unsauber und unbrauchbar wird. Ohne vernünftige Logik und Zeileneinrückung ist für andere der Code quasi komplett unleserlich. Und auch für einen selbst, wie man hier schön sieht. Also mach dir das Leben selbst leicht und versuche etwas saubereren Code zu schreiben (indem du alles einrückst mit TAB).
- Im Forum bitte immer den Code BBCode nutzen, wenn man Code schreibt. Am Besten mit Syntax Hervorhebung (in diesem Fall käme C der Pawn Syntax sehr nahe.)
- Du solltest einen Streamer nutzen (also CreateDynamicObject) und nicht CreateObject, da du sonst sehr schnell an das Objekt-Limit von 1000 Objekten stößt und keine weiteren Objekte mehr geladen werden. Auch für die Spieler läuft das Spiel flüssiger, wenn nicht unnötig viele Objekte geladen werden.
- Du solltest einen "CMD-Prozessor" verwenden, wie ocmd/zcmd/ycmd oder am Besten Pawn.CMD. Mit "strcmp" sorgst du dafür, dass der Server für jeden Befehl immer länger und länger benötigt diesen zu verarbeiten. Des Weiteren wird es sehr unübersichtlich jeden Befehl in einen Callback zu packen.
- So wie du hier das Geldsystem verwendest, ist es für den Client sehr einfach Geld zu cheaten! Man kann dies verhindern, indem du das Geld Serverseitig trackst. Aus diesem und vielen Weiteren Gründen aus dieser Liste, ist es deshalb oft einfacher Includes zu nutzen, anstatt Filterscripts, da man schon auf alle Funktionen / Includes & Variablen aus dem Gamemode direkt zugreifen kann.
So und nun zu deinem Code:
#include <a_samp>
//====DEFINIERE ZOLL ====//
forward GateClosezoll1();
new schranke;
//======Farben====//
#define Rot 0xFF000FFF
#define Blau 0x0037FFFF
#define Weiß 0xFEFEFEFF
#define Grün 0x00FF14FF
//====ERSTELLE OBJEKTE====//
public OnFilterScriptInit()
{
print("\n========================================");
print("=======Meine Zollstationen========");
print("========================================\n");
//===================================================================================//
CreateObject(966, 636, -1190, 17.4, 0, 358, 30);
schranke = CreateObject(968, 635.79999, -1190.1, 18.3, 0, 268, 30);//Schranke zum Bewegen
Create3DTextLabel("Willkommen an der Zollstation Tippe /zoll um den Zoll zu passieren",0xFFFFFFAA,634.2861,-1195.9208,18.1169,40.0,0,0);//Zoll -1-
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmdtext, "/zoll", true) == 0)
{
if(IsPlayerInRangeOfPoint(playerid,5.0,634.2861,-1195.9208,18.1169))
{
MoveObject(schranke, 635.79999, -1190.1, 18.3, 0.0002, 268-0.001, 30, 0.0);
SendClientMessage(playerid,Rot,"Mautgebühr 500€");
GameTextForPlayer(playerid, "~g~Mautgebuehr: ~r~-500$", 5000, 1);
GivePlayerMoney(playerid,-500);
Create3DTextLabel("Willkommen an der Zollstation Tippe /zoll um den Zoll zu passieren",0xFFFFFFAA,634.2861,-1195.9208,18.1169,40.0,0,0);
SetTimer("zoll1",5000,false);
return 1;
}
if(!IsPlayerInRangeOfPoint(playerid,5.0,634.2861,-1195.9208,18.1169))
{
MoveObject(schranke, 635.79999, -1190.1, 18.3, 0.0002, 268+0.001, 30, 0.0);
SetTimer("zoll1",1000,false);
return 1;
}
else
{
SendClientMessage(playerid,Rot,"Sie sind an keiner Zollstation!");
return 1;
}
}
return 0;
}
Alles anzeigen
So sieht es doch ein wenig übersichtlicher aus.
Allerdings gibt es viele Probleme damit:
- Angenommen du hast 20 Mautstationen, willst du die wirklich alle manuell einfügen. Solltest du das vor haben, sollte schnell klar sein, es würden viele "Redundanzen" (also Code-Wiederholungen) entstehen. So etwas mag man als Programmierer immer vermeiden! Zum einen, weil es übersichtlich und besser ist, zum Anderen, weil wir alle sehr faule Wesen sind. Aus diesem Grund, solltest du dann Arrays nutzen und eine Schleife.
- In deinem Befehl prüfst du entweder, ob er sich entweder an der Mautstation befindet, oder ob er es nicht ist (wenn er es nicht ist, bewegst du das Objekt zurück). Und dann nutzt du noch eine "else" um zu sagen, dass er an keiner Zollstation ist...hmm, hoffe dir fällt hier was auf xD Was wäre denn die 3. Option? Es gibt doch nur entweder ist er da oder nicht. Das hier ist kein Quantensystem, da gibt es keine Superposition

- Die Rotation die du hier nimmst ist zu klein, das der Hauptfehler. Eine der X, Y oder Z Achsen musst du mit dem +0.001 versehen, die Rotation allerdings muss normal geändert werden.
Also so würde es funktionieren:
#include <a_samp>
//====DEFINIERE ZOLL ====//
forward GateClosezoll1();
new schranke;
//======Farben====//
#define Rot 0xFF000FFF
#define Blau 0x0037FFFF
#define Weiß 0xFEFEFEFF
#define Grün 0x00FF14FF
//====ERSTELLE OBJEKTE====//
public OnFilterScriptInit()
{
print("\n========================================");
print("=======Meine Zollstationen========");
print("========================================\n");
//===================================================================================//
CreateObject(966, 636, -1190, 17.4, 0, 358, 30);
schranke = CreateObject(968, 635.79999, -1190.1, 18.3, 0, 268, 30);//Schranke zum Bewegen
Create3DTextLabel("Willkommen an der Zollstation Tippe /zoll um den Zoll zu passieren",0xFFFFFFAA,634.2861,-1195.9208,18.1169,40.0,0,0);//Zoll -1-
return 1;
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if(strcmp(cmdtext, "/zoll", true) == 0)
{
if(IsPlayerInRangeOfPoint(playerid,5.0,634.2861,-1195.9208,18.1169))
{
MoveObject(schranke, 635.79999, -1190.1, 18.3-0.0002, 0.0002, 0, 358, 30);
SendClientMessage(playerid,Rot,"Mautgebühr 500€");
GameTextForPlayer(playerid, "~g~Mautgebuehr: ~r~-500$", 5000, 1);
GivePlayerMoney(playerid,-500);
Create3DTextLabel("Willkommen an der Zollstation Tippe /zoll um den Zoll zu passieren",0xFFFFFFAA,634.2861,-1195.9208,18.1169,40.0,0,0);
SetTimer("GateClosezoll1",5000,false);
return 1;
}
else
{
SendClientMessage(playerid,Rot,"Sie sind an keiner Zollstation!");
return 1;
}
}
return 0;
}
public GateClosezoll1()
{
MoveObject(schranke, 635.79999, -1190.1, 18.3+0.0002, 0.0002, 0, 268, 30);
return 1;
}
Alles anzeigen