wie kann ich cp's definieren und dann das wenn man ein bestimmten cp betritt das da dann zb bei dem einen ne message kommt zb du hast cp1 betreten und beim anderen du hast cp 2 betreten???
cp's definieren
- Killasplash
- Geschlossen
- Erledigt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
static Float:cp_coords[][3] = { {XCOORDS, YCOORDS, ZCOORDS},
... };
new statePlayerCP[MAX_PLAYERS], bool:isPlayerStreamCP[MAX_PLAYERS], bool:incp[MAX_PLAYERS];
#define MAX_DISTANCE_BETWEEN_CPS 20.0
#define MAX_SIZE_CP 5.0
forward GlobalTimer();
stock Float:GetDistance(Float:x, Float:xx, Float:y, Float:yy, Float:z, Float:zz)
return floatsqroot(floatpower(floatabs(x - xx), 2) + floatpower(floatabs(y - yy), 2) + floatpower(floatabs(z - zz), 2));
public OnGameModeInit() {
SetTimer("GlobalTimer", 1000, 1);
return 1;
}
public GlobalTimer() {
new Float:dist = MAX_DISTANCE_BETWEEN_CPS, Float:tmpdist, Float:each[3];
for(new i = 0; i < MAX_PLAYERS; i++) {
if(isPlayerStreamCP[i] == false) {
GetPlayerPos(i, each[0], each[1], each[2]);
statePlayerCP[i] = -1;
for(new j = 0; j < sizeof cp_coords; j++) {
tmpdist = GetDistance(cp_coords[j][0], each[0], cp_coords[j][1], each[1], cp_coords[j][2], each[2]);
if(tmpdist < dist) {
statePlayerCP[i] = j;
dist = tmpdist;
}
}
if(statePlayerCP[i] != -1) {
isPlayerStreamCP[i] = true;
SetPlayerCheckpoint(i, cp_coords[statePlayerCP[i]][0], cp_coords[statePlayerCP[i]][1], cp_coords[statePlayerCP[i]][2], MAX_SIZE_CP);
}
} else if(isPlayerStreamCP[i] == true && incp[i] == false) {
DisablePlayerCheckpoint(i);
isPlayerStreamCP[i] = false;
}
}
}
public OnPlayerEnterCheckpoint(playerid) {
switch(statePlayerCP[playerid]) {
case 0: {
/* tu was z.b. das: */
SendClientMessage(playerid, 0xFF6900AA, "CP 1!");
} case 1: {
SendClientMessage(playerid, 0xFF0000AA, "CP 2!");
}
/* ... */
}
incp[playerid] = true;
return 1;
}
public OnPlayerLeaveCheckpoint(playerid) {
incp[playerid] = false;
return 1;
}Ist aus dem Kopf geschrieben, könnten paar fehler sein, sollte aber sonst eigendlich funktionieren.
-
ich ahbe die errors jetzt weg jedoch blinken die cp'S und nur wenn ich
in dem cp stehe dann bleibt der die ganze zeit da und es erscheint auch
nur einre zur zeit das heißt wenn ich paar schritte nach links gehe
zeigt der nur den 2 cp an und wenn ich wieder nach rechts gehe nur den
1 -
Ja bei SAMP kann man auch nur 1 CP zurzeit erstellen.
Das ist ein Streamer der halt den CP Dynamisch dahin setzt. -
kk das kann ich villt noch verstehen aber warum blibkt der denn?? auf anderen servern ist das nicht so der cp ist ja nur zu sehn wenn man richtig dicht dran ist^^
-
Neue version:
static Float:cp_coords[][3] = { {XCOORDS, YCOORDS, ZCOORDS},
... };
new statePlayerCP[MAX_PLAYERS], bool:isPlayerStreamCP[MAX_PLAYERS], bool:incp[MAX_PLAYERS], Float:cpDist[MAX_PLAYERS];
#define MAX_DISTANCE_BETWEEN_CPS 20.0
#define MAX_SIZE_CP 5.0
forward GlobalTimer();
stock Float:GetDistance(Float:x, Float:xx, Float:y, Float:yy, Float:z, Float:zz)
return floatsqroot(floatpower(floatabs(x - xx), 2) + floatpower(floatabs(y - yy), 2) + floatpower(floatabs(z - zz), 2));
public OnGameModeInit() {
SetTimer("GlobalTimer", 1000, 1);
return 1;
}
public GlobalTimer() {
new Float:dist = MAX_DISTANCE_BETWEEN_CPS, Float:tmpdist, Float:each[3];
for(new i = 0; i < MAX_PLAYERS; i++) {
if(isPlayerStreamCP[i] == false) {
GetPlayerPos(i, each[0], each[1], each[2]);
statePlayerCP[i] = -1;
for(new j = 0; j < sizeof cp_coords; j++) {
tmpdist = GetDistance(cp_coords[j][0], each[0], cp_coords[j][1], each[1], cp_coords[j][2], each[2]);
if(tmpdist < dist) {
statePlayerCP[i] = j;
dist = tmpdist;
}
}
if(statePlayerCP[i] != -1) {
isPlayerStreamCP[i] = true;
cpDist[i] = dist;
SetPlayerCheckpoint(i, cp_coords[statePlayerCP[i]][0], cp_coords[statePlayerCP[i]][1], cp_coords[statePlayerCP[i]][2], MAX_SIZE_CP);
}
} else if(isPlayerStreamCP[i] == true && incp[i] == false) {
GetPlayerPos(i, each[0], each[1], each[2]);
if(cpDist[i] > GetDistance(cp_coords[statePlayerCP[i]][0], each[0], cp_coords[statePlayerCP[i]][1], each[1], cp_coords[statePlayerCP[i]][2], each[2])) {
DisablePlayerCheckpoint(i);
isPlayerStreamCP[i] = false;
}
}
}
}
public OnPlayerEnterCheckpoint(playerid) {
switch(statePlayerCP[playerid]) {
case 0: {
/* tu was z.b. das: */
SendClientMessage(playerid, 0xFF6900AA, "CP 1!");
} case 1: {
SendClientMessage(playerid, 0xFF0000AA, "CP 2!");
}
/* ... */
}
incp[playerid] = true;
return 1;
}
public OnPlayerLeaveCheckpoint(playerid) {
incp[playerid] = false;
return 1;
}
Sollte das Blinken entfernen. -
das blinken ist weg jedoch zeigt der den anderen cp garnet mehr an und der eine cp ist die ganze zeit auf der mini karte zu sehen^^
-
Soll dir wer anders machen.
Ich geh davon aus das du vllt auch dir eine eigene Lösung überlgst und das nur als denkanstoß nimmst. -
ich kann aber nicht so gut scripten hat villt jemand nen guten cp streamer?
-
breadfish.de
Hat das Thema geschlossen.