Das kannst du machen.Ich weiß um ehrlich zu sein nicht was die Schleife da oben genau soll
Die von Kali oder von mir?
Das kannst du machen.Ich weiß um ehrlich zu sein nicht was die Schleife da oben genau soll
Die von Kali oder von mir?
Oh habe mir schon gedacht dass meine Vorhaben nicht so einfach zu realisieren sind
Aber kann man beim Array nicht eigentlich immer als Index fuer die letzte Zeile sizeof(array)-1 als Index nehmen?
Moin
Habe eine Funktion CreateGlobalActor welche einen Actor und ein Pickup vor ihm erstellt.
Ich generiere in OnGameModeInit Actors, abhaengig davon wie gross das Eingangsarray ist.
CreateGlobalActor(actorid,modelid,Float:ax,Float:ay,Float:az,Float:angle,Float:distance,pickupid)
for(new g=0;g<sizeof(GlobalActors);g++)
{
CreateGlobalActor(g+1,274,GlobalActors[g][0],GlobalActors[g][1],GlobalActors[g][2],GlobalActors[g][3],3.0,g+4000);
SetActorInvulnerable(g+1, true);
}
Ich habe jedoch das Problem damit.
Ich erwarte wenn ich hinten mit g+4000 eine Pickupid fuer das zu erstellende Pickup waehle, diese Beispielsweise bei 4000, 4001 usw. liegt.
Jedoch ist das leider nicht der Fall, nach dem Erstellen hat das Ding eine Pickupid von 1..2..3
Wie kann ich innerhalb einer for Schleife einzigartige Pickupids erstellen mit denen ich auch nachher was in OnPlayerPickUpPickup anstellen kann?
Sowas habe ich versucht, hat jedoch nicht geklappt.
Das Problem ist, wenn ich eine Pickupid zwischen 1-5 z.B. habe, nehmen scheinbar neu generierte Pickups auch einer dieser IDs an, so dass irgendwann nurnoch der else Teil zutrifft
public OnPlayerPickUpPickup(playerid, pickupid)
{
if(pickupid >= 4000 && pickupid <= 4095)
{
ShowMenuForPlayer(shopmenu,playerid);
TogglePlayerControllable(playerid,false);
}
else
{
maxmoney = maxmoney -1;
DestroyPickup(pickupid);
GivePlayerMoney(playerid, 1000);
printf("ID picked up: %d",maxmoney);
}
return 1;
}
Alles anzeigen
Habe mir eventuell ueberlegt ob enum helfen kann, aber ich finde keinen Ansatz
Bitte um Rat
Ist es ausserdem Moeglich, irgendwie aus einem Array immer die letzte Zeile im Array auszulesen?
Ohje danke dir dass du mich auf den Leim gebracht hast habe die ganze nicht gerafft dass das bei Textdraws nicht geht.
Habe daher nun 2 Textdraws gemacht, einer wo Team: Steht, in weiss, und einer mit der Teambezeichnung und diese mit PlayerTextDrawColor dann gesetzt Jetzt ist es so wie ich wollte.
Achso wegen dem Violett danke Kaliber Habe gedacht dass es auch im deutschen immer Violet gewesen sei
So eine weitere Frage, oder vielleicht mache ich deswegen lieber ein neues Thema auf
Habe leider wegen der Farbcodes (Fuer Spieler, Textdraws., Client Messages) verdammt viele #defines drin.
Kann ich die irgendwie kuerzen? Bzw. ist es moeglich beispielweise Funktionen in #defines einzubauen, durch die ich aus einer Hexfarbe alle anderen Farben ableiten kann?
Das ist das was ich habe
#define FIRST_TEAM_COLOR_TAG "{610D96}VIOLETT"
#define SECOND_TEAM_COLOR_TAG "{FFFF00}YELLOW"
#define THIRD_TEAM_COLOR_TAG "{8B4513}BROWN"
#define FOURTH_TEAM_COLOR_TAG "{2EFF31}LIME"
#define FIRST_TEAM_NAME_TAG "VIOLETT"
#define SECOND_TEAM_NAME_TAG "YELLOW"
#define THIRD_TEAM_NAME_TAG "BROWN"
#define FOURTH_TEAM_NAME_TAG "LIME"
#define FIRST_TEAM_TD_COLOR 0x610D96FF//Violett
#define SECOND_TEAM_TD_COLOR 0xFFFF00FF//Yellow
#define THIRD_TEAM_TD_COLOR 0x8B4513FF//Brown
#define FOURTH_TEAM_TD_COLOR 0x2EFF31FF//Lime
// Team colors
#define COLOR_TEAM_ONE 0x610D9655 //Violett
#define COLOR_TEAM_TWO 0xFFFF0055 //Yellow
#define COLOR_TEAM_THREE 0x8B451355 //Brown
#define COLOR_TEAM_FOUR 0x2EFF3155 //Lime
Alles anzeigen
Rein logisch gedacht kann man ja aus den Codes in den Zeilen 11-14 alles andere zusammenzimmern, hat jemand dazu einen Ansatz?
So
Habe mal als Bilder wie es sein sollte, und wie es jetzt ist:
Damals habe ich die Farbe direkt im Textdrawstring drin gehabt.
Jetzt will ich das ganze aber nicht mehr statisch drin haben, sondern dynamisch per Makro einbauen koennen.
Der komplette Codeblock:
if(gPlayerTeamSelection[playerid] == FIRST_TEAM) {
SetPlayerInterior(playerid,TEAM_ONE_SEL_INTERIOR);
SetPlayerCameraPos(playerid,ClassSel_SetupTeamTEAM_POS[0][0],ClassSel_SetupTeamTEAM_POS[0][1],ClassSel_SetupTeamTEAM_POS[0][2]);
SetPlayerCameraLookAt(playerid,ClassSel_SetupTeamTEAM_LOOK_AT[0][0],ClassSel_SetupTeamTEAM_LOOK_AT[0][1],ClassSel_SetupTeamTEAM_LOOK_AT[0][2]);
PlayerTextDrawHide(playerid,TeamText[playerid]);
PlayerTextDrawHide(playerid,LocText[playerid]);
new astring[64];
format(astring,sizeof(astring),"Team:");
strcat(astring,#FIRST_TEAM_COLOR_TAG);
PlayerTextDrawSetString(playerid, TeamText[playerid], astring);
PlayerTextDrawShow(playerid,TeamText[playerid]);
format(astring,sizeof(astring),"Location:"#FIRST_TEAM_LOCATION);
PlayerTextDrawSetString(playerid, LocText[playerid], astring);
PlayerTextDrawShow(playerid,LocText[playerid]);
SetPlayerWeather(playerid,15);
PlayerPlaySound(playerid,2403,0,0,0);
}
Alles anzeigen
Damals als alles noch "statisch" war habe ich den string fuer den Textdraw wie folgt formatiert:
format(astring,sizeof(astring),"Team: {610D96}VIOLET");
Da sah es so aus
Alles super, so wie es sein sollte.
Nun habe ich folgende Konstrukte probiert um das gleiche Ergebnis wie oben zu erhalten
format(astring,sizeof(astring),"Team: "#FIRST_TEAM_COLOR_TAG);
format(astring,sizeof(astring),"Team:");
und/oder strcat(astring,FIRST_TEAM_COLOR_TAG);
Erschien mir logisch da sogesehen beides einfache Strings sind, jedoch war das Ergebnis bei allen meinen Versuchen folgendes
Der String scheint zwar drin zu sein, aber das mit der Farbe haut irgendwie nicht hin.
Einzigen workaround den ich sehe, welcher aber nicht wirklich das gelbe vom Ei ist, ist das erstellen von 2 Textdraws, 1 Textdraw nur mit dem Inhalt "Team:" und ein 2ter der direkt daneben ist mit dem Inalt FIRST_COLOR_TEAM_TAG
Die Zeile ist wahrscheinlich einfach zu lang
Habe es hingekriegt, danke an euch
Habe es gerade mal mit Textdraws probiert, da kommt es immernoch auf dieses ? FF00FF YELLOW heraus.
Bei SendClientMessage interessanterweise kein Problem.
Kann es eventuell sein, dass das ganze mit Textdraws nicht moeglich ist?
Habe auch mal strcat(string,FIRST_TEAM_COLOR_TAG); probiert, klappt bei SendClientMessage aber nicht bei TextDraws
Das endet leider mit vielen Erros
/edit: werde ich probieren
Danke habe ich mal probiert, aber leider macht der Compiler das nicht mit
Ich kann dein Problem leider selber nicht nachvollziehen, bei mir läuft es auch mit 100.000+ Zeilen durch.
Hast du probiert mit CreateObject zu MTA?
Ich gruesse euch liebe Community,
Ich will mein Script schoen dynamisch gestalten damit man alles veraendern kann ohne das ganze Skript neuaufzubauen.
Ich habe einen Textdraw welcher den Namen des Teams anzeigt, hier mal Beispiel:
In der Teamauswahl wurde es wie folgt dargestellt:
Team: VIOLET
Dabei habe ich wie folgt formatiert:
format(astring,sizeof(astring),"Team: {610D96}VIOLET");
Also alles in Ordnung.
Nun wollte ich das ganze jedoch so machen, so dass ich die Farbe und den Teamnamen am Anfang des Skripts definiere.[/b]
#define FIRST_TEAM_COLOR_TAG "{610D96}VIOLET"
format(astring,sizeof(astring),"Team: "#FIRST_TEAM_COLOR_TAG);
Jedoch wird es dann falsch dargestellt, undzwar ingame als:
Team: ? 610D96 VIOLET
Wie kann ich das so machen, so dass es wie im ersten Beispiel, korrekt mit Farbe dargestellt wird?
so soll es am Ende aussehen Team: VIOLET
Moin
Habe ein kleines Programm geschrieben um solche Zeilen: CreateDynamicObject(3361,3487.77929688,3228.35913086,189.82043457,0.00000000,0.00000000,183.98803711); // object(cxref_woodstair) (168)
In folgendes Format umzuwandeln <object id="object (Konvert)(0)" breakable="true" interior="0" collisions="true" alpha="255" model="3361" doublesided="false" scale="1" dimension="0" posX="3487.779" posY="3228.359" posZ="189.8204" rotX="0" rotY="0" rotZ="183.988"></object>
und umgekehrt.
Jedoch habe ich das Problem, wenn ich Daten so umwandle funktioniert das ganze problemlos, aber wenn ich grosse Mengen an Daten nehme, das heisst mehr als 21000 Zeilen terminiert das Programm nicht.
Woran kann das liegen?
Hier mal mein gesamter Quellcode
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
/*
(1) CreateObject
(2) CreateDynamicObject
(3) MTA_SA
*/
int inputtype=0;
int outputtype=0;
objecttype()
{
printf("\nValid Object types\n");
printf("CreateObject: (1)\n");
printf("CreateDynamicObject: (2)\n");
printf("MTA_SA: (3)\n");
}
int main ( int argc, char *argv[] )
{
printf("\nSimple SA-MP/MTA-SA Object Converter\n");
printf("\nCopyright (C) 2017 Fabian Druschke (Knogle)");
printf("\nThis program comes with ABSOLUTELY NO WARRANTY; \nfor details see http://www.gnu.org/licenses/.");
printf("\nThis is free software, and you are welcome to redistribute it \n \n \n");
if ( argc != 2 )
{
printf( "Usage: %s [filename]\n", argv[0] );
}
else
{
FILE *fIn = fopen(argv[1], "r");
if ( fIn == 0 )
{
printf( "Could not open file\n" );
}
else
{
int inputtype=0;
int i=0;
int model = 0, items = 0;
float pos[3] = {0}, rot[3] = {0};
objecttype();
printf("\nSpecify input object type:\n");
scanf("%i",&inputtype);
if(inputtype != 1 || inputtype != 2 || inputtype != 3)
{
objecttype();
}
int outputtype=0;
printf("\nSpecify output object type:\n");
scanf("%i",&outputtype);
if(outputtype != 1 || inputtype != 2 || inputtype != 3)
{
objecttype();
}
if(outputtype == inputtype)
{
printf("You cannot convert objects into the same type!");
}
else
{
FILE *fOut = fopen("output.txt", "wb");
clock_t t;
t = clock();
if(inputtype == 1)//CreateObject
{
while ((items = fscanf(fIn, "%*[^-0123456789]%d%*[,]%f%*[,]%f%*[,]%f%*[,]%f%*[,]%f%*[,]%f%*s", &model, &pos[0], &pos[1], &pos[2], &rot[0], &rot[1], &rot[2])) != EOF)
{
if(outputtype == 3)
{
if (items == 7)
{
fprintf(fOut, "<object id=\"object (Konvert)(%d)\" breakable=\"true\" interior=\"0\" collisions=\"true\" alpha=\"255\" model=\"%d\" doublesided=\"false\" scale=\"1\" dimension=\"0\" posX=\"%.7g\" posY=\"%.7g\" posZ=\"%.7g\" rotX=\"%.7g\" rotY=\"%.7g\" rotZ=\"%.7g\"></object>\n", i,model, pos[0], pos[1], pos[2], rot[0], rot[1], rot[2]);
i++;
}
}
if(outputtype == 2)
{
if (items == 7)
{
fprintf(fOut, "CreateDynamicObject(%d,%f,%f,%f,%f,%f,%f);// Object (%d)\n",model, pos[0], pos[1], pos[2], rot[0], rot[1], rot[2],i);
i++;
}
}
}
}
if(inputtype == 2)//CreateDynamicObject
{
while ((items = fscanf(fIn, "%*[^-0123456789]%d%*[,]%f%*[,]%f%*[,]%f%*[,]%f%*[,]%f%*[,]%f%*s", &model, &pos[0], &pos[1], &pos[2], &rot[0], &rot[1], &rot[2])) != EOF)
{
if(outputtype == 3)
{
if (items == 7)
{
fprintf(fOut, "<object id=\"object (Konvert)(%d)\" breakable=\"true\" interior=\"0\" collisions=\"true\" alpha=\"255\" model=\"%d\" doublesided=\"false\" scale=\"1\" dimension=\"0\" posX=\"%.7g\" posY=\"%.7g\" posZ=\"%.7g\" rotX=\"%.7g\" rotY=\"%.7g\" rotZ=\"%.7g\"></object>\n", i,model, pos[0], pos[1], pos[2], rot[0], rot[1], rot[2]);
i++;
}
}
if(outputtype == 1)
{
if (items == 7)
{
fprintf(fOut, "CreateObject(%d,%f,%f,%f,%f,%f,%f);// Object (%d)\n",model, pos[0], pos[1], pos[2], rot[0], rot[1], rot[2],i);
i++;
}
}
}
}
if(inputtype == 3)//MTA_SA
{
char str1[32], str2[32], str3[32], str4[32], str5[32], str6[32] ,str7[32], str8[32], str9[32],strnum[32];
char objstr[32];
char line[512];
while (fgets(line, 512 , fIn) != NULL)
{
if(strstr(line,"vehicle") || strstr(line,"ped") || strstr(line,"removeWorld"))
continue;
char searchchar = '\"';
char replacechar = ' ';
char *valueptr;
valueptr = strchr(line, searchchar);
if(valueptr != NULL)
*valueptr = replacechar;
while (valueptr !=NULL)
{
valueptr = strchr(valueptr + 1, searchchar);
if(valueptr != NULL)
*valueptr = replacechar;
}
searchchar = '=';
replacechar = ' ';
valueptr = strchr(line, searchchar);
if(valueptr != NULL)
*valueptr = replacechar;
while (valueptr !=NULL)
{
valueptr = strchr(valueptr + 1, searchchar);
if(valueptr != NULL)
*valueptr = replacechar;
}
if(strstr(line,"collision") && !(str1[0] == '\0'))
if(items = sscanf(line,"%*s %*s %*s %s %s %*s %*s %*s %*s %*s %*s %*s %*s %*s %s %*s %*s %*s %*s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s",str1,strnum,str2,str3,str4,str5,str6 ,str7,str8,str9));
if(str1[0] == '\0')
if(items = sscanf(line,"%*s %*s %*s %s %s %*s %*s %*s %*s %*s %*s %*s %*s %*s %s %*s %*s %*s %*s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s",str1,strnum,str2,str3,str4,str5,str6 ,str7,str8,str9));
if(!strstr(line,"collision") && !(str1[0] == '\0'))
if(items = sscanf(line,"%*s %*s %*s %s %s %*s %*s %*s %*s %*s %*s %*s %s %*s %*s %*s %*s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s",str1,strnum,str2,str3,str4,str5,str6 ,str7,str8,str9));
long int xmlmodelid = atoi(str2);
float xmlPosX= atof(str4);
float xmlPosY= atof(str5);
float xmlPosZ= atof(str6);
float xmlRotX= atof(str7);
float xmlRotY= atof(str8);
float xmlRotZ= atof(str9);
{
if(outputtype == 2)
{
if (items == 10)
{
fprintf(fOut, "CreateDynamicObjectObject(%li,%f,%f,%f,%f,%f,%f);// %s %s\n",xmlmodelid,xmlPosX, xmlPosY,xmlPosZ,xmlRotX,xmlRotY,xmlRotZ,str1,strnum);
i++;
}
}
if(outputtype == 1)
{
if (items == 10)
{
fprintf(fOut, "CreateObject(%li,%f,%f,%f,%f,%f,%f);// %s %s\n",xmlmodelid,xmlPosX, xmlPosY,xmlPosZ,xmlRotX,xmlRotY,xmlRotZ,str1,strnum);
i++;
}
}
}
}
}
t = clock() - t;
double time_taken = ((double)t)/CLOCKS_PER_SEC; // in seconds
printf("\nThe conversion took %.4f seconds to finish \n", time_taken);
fclose(fOut);
fclose(fIn);
printf("%d Objekt(e) konvertiert.\n\n",i);
return 0;
}
}
}
}
Alles anzeigen
bzw. der Block bei Zeile 78 und 104 auf Pastebin http://pastebin.com/LAMxv5hi
Der Block bei Zeile 130, also das ueberfuehren von dem XML Format mit <object> etc. in CreateObject wie oben angegeben funktioniert problemlos, auch mit grossen Dateien, nur der andere Weg, CreateObject in XML fuehrt zu Fehlern, da wie gesagt das Programm nicht terminiert.
Irgendwann bricht in der Output Datei, immer ab Zeile 20264 der Output so ab:
<object id="object (Konvert)(20263)" breakable="true" interior="0" collisions="true obwohl es weitergehen sollte.
Was glaubst du wo die Markenhandys gebaut werden?
Moin
Ich habe mir mal einen kleinen Objektkonverter zusammengebaut, aus dem einfachen Grund, da mein Lieblingsonlinekonverter convertffs.com seit einiger Zeit offline ist, und ich super oft reichlich Objekte konvertieren muss.
Da ich gerne minimalistisch Programmiere ist das ganze als Commandline Programm erschienen.
Weiterhin hat mich gestoert dass bei grossen Maps, das Hochladen von grossen Maps ab 5000 Objekten nicht moeglich war, und auch darunter ewigst lange gedauert habe.
Habe mir fuer meine Zwecke daher einen kleinen C basierten Konverter gebastelt, welcher mithilfe von fscanf und sscanf die Werte parst und letztendlich einfach wieder in ein anderes Format bringt, und dann printet.
Aktuell gibt es das ganze als Linux und Windows Version, weiterhin will ich darauf hinweisen dass das Programm Bugs enthalten kann.
Wenn Bugs gefunden werden, bitte eine E-Mail an webmaster@knogleinsi.de verfassen, oder in diesem Thread hier schreiben.
Auf Effizienz wurde bisher nicht geachtet, da selbst bei knapp 100000 Objekten das Konvertieren im Worst Case, d.h. MTA:SA zu SA:MP CreateObject nur ca. 1.6 Sekunden dauert.
Die Laufzeit des Programs ist nach O-Notation im Best Case ne Laufzeit von O(3n) , und im Worst Case (MTA:SA zu SA:MP) ca. O(6n)
Ziel ist es, neben reinem Objekte Konvertieren, auch das Konvertieren von Fahrzeugen, Peds/Actors, Pickups etc. zu ermoegliche, wie im SA-MP MapConverter Plugin im englischen SA-MP Forum.
Aktuell werden Zeilen, welche Vehicle, Peds oder Pickups enthalten uebersprungen!
Readme
Copyright (C) 2017 Fabian Druschke (Knogle)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/
Compiler settings:
Linux: gcc simpleconverter.c
Windows MinGW: gcc simpleconverter.c
Usage:
Linux: ./a.out foo.map
Windows: a foo.map
Output file output.txt will be written into the same directory.
Alles anzeigen
Ein Beispiel Ablauf
Datei ist converter.exe und wird mit der Inputdatei als Parameter ausgefuehrt.
(Geht auch per Batch datei, z.B. mit Inhalt:
converter.exe input.txt)
converter.exe objects.txt
Ausgabe wird in der Datei output.txt erstellt, das ganze funktioniert zumindest bei mir aktuell zuverlaessig.
Dannach spezifiziert man mit einer Zahl von 1-3 den Inputtyp der Objekte, und dannach wieder mit 1-3 den gewuenschten Output.
Fertig!
XML Parser wurde bisher nicht genutzt, ist wahrscheinlich fuer die Anforderungen overkill.
Weiterhin waere das Programm allein durch die Implementierung eines solchen, locker doppelt so lang.
Beispielinput:
<object id="object (des_ebrigroad07) (1)" breakable="true" interior="0" alpha="255" model="16358" doublesided="false" scale="1" dimension="0" posX="-1135.2" posY="-866.29999" posZ="62.5" rotX="0" rotY="0" rotZ="314"></object>
<object id="object (des_ebrigroad07) (2)" breakable="true" interior="0" alpha="255" model="16358" doublesided="false" scale="1" dimension="0" posX="-1135.3" posY="-866.20001" posZ="72.7" rotX="0" rotY="0" rotZ="313.995"></object>
<object id="object (des_ebrigroad07) (3)" breakable="true" interior="0" alpha="255" model="16358" doublesided="false" scale="1" dimension="0" posX="-1140.6" posY="-871.40002" posZ="66.1" rotX="90" rotY="0" rotZ="313.995"></object>
Output:
CreateObject(16358,-1135.199951,-866.299988,62.500000,0.000000,0.000000,314.000000);// (des_ebrigroad07)
CreateObject(16358,-1135.300049,-866.200012,72.699997,0.000000,0.000000,313.994995);// (des_ebrigroad07)
CreateObject(16358,-1140.599976,-871.400024,66.099998,90.000000,0.000000,313.994995);// (des_ebrigroad07)
Ich hoffe es ist fuer jemanden, wie in der Lizenz bereits erwaehnt, useful Updates folgen woechentlich
Weiterhin habe ich vor auch andere Objektformate abzudecken.
Download:
https://github.com/Knogle/SimpleConverter
Oder Source only:
Habe leider nie herausbekommen von wem die entwickelt worden ist weil die 100 fach im englischen Forum drin war
Warum haben die denn dann damals nicht diese Variante genommen wenn sie einfacher ist?
Kaliber: Das werde ich mal probieren und mich nachher zurueckmelden.
Ich will ja meinen Gamemode dahingehend dynamisch gestalten, so dass man alles von einer extra Datei aus steuern kann die einfach eingebunden wird, so dass man viele Sachen machen kann und das nicht so starr ist.
Nun habe ich eine Teamanzahl definiert, faelschlicherweise habe ich das jetzt hier TEAMSIZE genannt, mache ich nachher zu AMOUNT_OF_TEAMS der sowas.
Naja aufjedenfall will ich dass alles in Abhaengigkeit von TEAMSIZE angepasst wird.
TEAMSIZE soll einen gueltigen Wert haben von 2-6 mit #assert TEAMSIZE >= 2 && <= 6
Habe daher nun vor das ganze umzuschreiben.
Als Beispiel nehme ich folgende Funktion welche ich bisher 1:1 aus Grand Larceny uebernommen habe, welche von 3 Teams ausgeht
ClassSel_SetupCharSelection(playerid)
{
TextDrawHideForPlayer(playerid,Textcover);
if(gPlayerTeamSelection[playerid] == FIRST_TEAM) {
SetPlayerVirtualWorld(playerid,1);
SetPlayerPos(playerid,243.1261,1805.2798,8.3794);
SetPlayerFacingAngle(playerid,180.0);
SetPlayerCameraPos(playerid,243.2876,1802.5547,7.4141);
SetPlayerCameraLookAt(playerid,243.1261,1805.2798,8.3794);
SetPlayerColor(playerid,COLOR_TEAM_ONE);
}
else if(gPlayerTeamSelection[playerid] == SECOND_TEAM) {
SetPlayerVirtualWorld(playerid,1);
SetPlayerPos(playerid,243.1261,1805.2798,8.3794);
SetPlayerFacingAngle(playerid,180.0);
SetPlayerCameraPos(playerid,243.2876,1802.5547,7.4141);
SetPlayerCameraLookAt(playerid,243.1261,1805.2798,8.3794);
SetPlayerColor(playerid,COLOR_TEAM_TWO);
}
else if(gPlayerTeamSelection[playerid] == THIRD_TEAM) {
SetPlayerVirtualWorld(playerid,1);
SetPlayerPos(playerid,243.1261,1805.2798,8.3794);
SetPlayerFacingAngle(playerid,180.0);
SetPlayerCameraPos(playerid,243.2876,1802.5547,7.4141);
SetPlayerCameraLookAt(playerid,243.1261,1805.2798,8.3794);
SetPlayerColor(playerid,COLOR_TEAM_THREE);
}
}
Alles anzeigen
Habe ich, damit ich diese Wiederholungen von gleichem Code vermeide so geschrieben
ClassSel_SetupCharSelection(playerid)
{
TextDrawHideForPlayer(playerid,Textcover);
if(gPlayerTeamSelection[playerid] != 0)
{
SetPlayerVirtualWorld(playerid,1);
SetPlayerPos(playerid,243.1261,1805.2798,8.3794);
SetPlayerFacingAngle(playerid,180.0);
SetPlayerCameraPos(playerid,243.2876,1802.5547,7.4141);
SetPlayerCameraLookAt(playerid,243.1261,1805.2798,8.3794);
switch
if(gPlayerTeamSelection[playerid]== TEAM_ONE)
switch(TEAMSIZE)
{
case: >=2
{
switch(gPlayerTeamSelection[playerid])
{
case 1:
{
SetPlayerColor(playerid,COLOR_TEAM_ONE);
}
case 2:
{
SetPlayerColor(playerid,COLOR_TEAM_TWO);
}
}
}
case: >=3
{
switch(gPlayerTeamSelection[playerid])
{
case 3:
{
SetPlayerColor(playerid,COLOR_TEAM_THREE);
}
}
}
case: >=4
{
switch(gPlayerTeamSelection[playerid])
{
case 3:
{
SetPlayerColor(playerid,COLOR_TEAM_FOUR);
}
}
}
case: >=5
{
switch(gPlayerTeamSelection[playerid])
{
case 3:
{
SetPlayerColor(playerid,COLOR_TEAM_FIVE);
}
}
}
case: >=6
{
switch(gPlayerTeamSelection[playerid])
{
case 3:
{
SetPlayerColor(playerid,COLOR_TEAM_SIX);
}
}
}
}
}
Alles anzeigen
Ist das sinvoll bzw. funktionsfaehig? Oder gibt es eine einfachere Variante? Sind switch case strukturen guter Programmierstil?
Und warum ist das hier falsch?
#if defined TEAMSIZE
#if TEAMSIZE>=2
SetTimer("MONEY_TEAM_ONE", MoneyDropTimer, true);
SetTimer("MONEY_TEAM_TWO", MoneyDropTimer, true);
SetTimer("MONEY_MAIN", 1000, true);
#if TEAMSIZE>=3
SetTimer("MONEY_TEAM_THREE", MoneyDropTimer, true);
#if TEAMSIZE>=4
SetTimer("MONEY_TEAM_FOUR",MoneyDropTimer,true)
#else if TEAMSIZE>=5
SetTimer("MONEY_TEAM_FIVE",MoneyDropTimer,true)
#else if TEAMSIZE==6
SetTimer("MONEY_TEAM_SIX",MoneyDropTimer,true)
#endif
#endif
Alles anzeigen
Jo
Gehen wir mal davon aus dein Ding ist ein Pickup
Dann kann man ne Reihe von Pickup Modellen in einem Array zusammenfassen, und das Ding dann random an einer deiner Positionen spawnen lassen
So etwa
stock const Items[]={
{1212},
{1213},
{1214},
{1215}
};
stock const Float:Positionen[][] = {
{-2340.0759,-1984.2560,327.3245,96.6453},
{-2265.7549,-1982.4696,251.1930,327.2607},
{-2336.1033,-2026.0273,270.5272,153.9858},
{-2371.8701,-2009.8907,259.0939,163.6758},
{-2431.2183,-2012.5878,228.1622,206.6029},
{-2321.6675,-2031.6503,260.7211,265.2202},
{-2284.3025,-1956.8335,270.9055,218.2196}
};
randSpawn = random(sizeof(Positionen));
randItem = random(sizeof(Items));
[...]
CreatePickup(Items[randItem],12,Positionen[randSpawn][0],Positionen[randSpawn][1],Positionen[randSpawn][2],0);
Alles anzeigen
Dann kannst du doch einfach ein Array mit Positionen machen, und ein Array mit Items und suchst dir mit einem random Index jeweils ein Item zu einer Position raus.
Soll es auch an Random Orten spawnen? Wenn ja kann ich helfen