Das ganze sieht wirklich gut aus nur würde ich noch ein wenig die Texturen ändern , wie die von der Decke zum Beispiel.
Beiträge von IPrototypeI
-
-
Die Objekte habe ich nur in die Luft setzen können, kann mir jemand erklären, wie ich die Objekte nun zur Seite schieben kann?
In dem du die jeweiligen offsets eingibst also verschiebung in x -richtung oder in y-richtung
-
case 3: format(SektorInfo[i][sName], 16, "%s", strlen(tmpstring));
zu
case 3: format(SektorInfo[i][sName], 16, "%s",tmpstring);Dann sollte es gehen. strlen gibt dir ja nur die Länge des namens zurück.
meiner meinung nach gehört sowieso jeder geschlagen der zwei strings mit format zusammenfügen möchte.
für was gibt es memcpy oder strcat. Nur ist hierzu zu beachten das man die länge angibt da sizeof in dem fall bei den optionalen Parametern eine Funktion nix nutzt. -
#include <a_samp>
#include <streamer>
#include <a_mysql_r6>
#include <sscanf2>new c_handler;
#define MAX_SECTOR 10
enum sektor_daten {
sCID,
sName[16],
Float:sX1,
Float:sY1,
Float:sX2,
Float:sY2,
sArt,
sSektorGZ,
sSektorA,
};
new SektorInfo[MAX_SECTOR][sektor_daten];enum {
CREATE_SEKTOR= 1,
};CreateConnection(){
c_handler = mysql_connect("localhost","root","sektors","");
mysql_debug(1);
if(!mysql_ping(c_handler))return printf("Could not connect to the database!");
return printf("Connect with the database");
}
main(){}
public OnQueryFinish(query[], resultid, extraid, connectionHandle)
{
switch(resultid)
{
case CREATE_SEKTOR:
{
mysql_store_result(connectionHandle);
printf(" %d Sektoren geladen.",mysql_num_rows(connectionHandle));
new i, result[128];
while(mysql_fetch_row_format(result,"|",connectionHandle)){
sscanf(result,"p<|>e<is[16]ffffi-ii->",SektorInfo[i]);
SektorInfo[i][sSektorGZ]= GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
SektorInfo[i][sSektorA]= CreateDynamicRectangle(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
++i;
}
mysql_free_result(connectionHandle);
}
}
return 1;
}
public OnPlayerEnterDynamicArea(playerid, areaid){
new i,str[30];
for(; i != MAX_SECTOR; ++i){
if(areaid != i)continue;
format(str,30,"Zone %s betreten",SektorInfo[i][sName]);
SendClientMessage(playerid,-1,str);
break;
}
return 1;}
public OnPlayerLeaveDynamicArea(playerid, areaid){
new i,str[30];
for(; i != MAX_SECTOR; ++i){
if(areaid != i)continue;
format(str,30,"Zone %s verlassen",SektorInfo[i][sName]);
SendClientMessage(playerid,-1,str);
break;
}
return 1;
}CreateTable(){
mysql_query("CREATE TABLE IF NOT EXISTS `sektor`(`ID` INT AUTO_INCREMENT, `Name` VARCHAR(16),`X1` FLOAT, `Y1` FLOAT,`X2` FLOAT,`Y2` FLOAT, `Kind` TINYINT, PRIMARY KEY(`ID`)) AUTO_INCREMENT = 1, ENGINE = MYISAM;");
return 1;
}public OnGameModeInit()
{
CreateConnection();
CreateTable();
// mysql_query("INSERT INTO `sektor`(`ID`,`Name`,`X1`,`Y1`,`X2`,`Y2`,`Kind`) VALUES (0,'No-Name',344.7781,-2115.6372,654.8240,-1579.5255,1);",0,0,c_handler);
// mysql_query("INSERT INTO `sektor`(`ID`,`Name`,`X1`,`Y1`,`X2`,`Y2`,`Kind`) VALUES (0,'DM-Zone',278.3560,-1721.2578,331.6490,-1677.0620,2);",0,0,c_handler);
// mysql_query("INSERT INTO `sektor`(`ID`,`Name`,`X1`,`Y1`,`X2`,`Y2`,`Kind`) VALUES (0,'Test',309.0497,-1792.3577,335.5938,-1772.6873,0);",0,0,c_handler);
mysql_query("SELECT * FROM `sektor`;",CREATE_SEKTOR,0,c_handler);
SetGameModeText("Blank Script");
AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
return 1;
}public OnGameModeExit()
{
mysql_close(c_handler);
return 1;
}Hier bitte das ganze funktioniert so wie es soll
-
Um noch Goldkillers post zu ergänzen
um tabellen übergreifend zu arbeiten oder datenbank übergreifend nutzt man einen . um somit einen art pfad zu erstellen.
datenbank.tabelle.spalte
-
und was ist das {-1,... }; bei
new Orten[MAX_PLAYERS] = {-1,... };Da deklarierst das Array Orten[MAX_PLAYERS] somit mit einem default wert das ... bewirkt das die -1 für jede Zelle gesetzt wird.
-
echt? ich hatte mir unter textdraws immer was anderes vorgestellt
Nur um dir vieles zu erleichtern gibt es sogenannte Textdraweditoren womit das ganz einfach geht.
siehe:
Ipleomaxtextdraweditor:
http://forum.sa-mp.com/showthread.php?t=376758Zamaroht textdraweditor:
http://forum.sa-mp.com/showthread.php?t=290640Ich persönlich präferiere den von Ipleomax, jedoch sollte dir auch bewusst sein das dieser aufgrund des Plugin nur auf deinem localen server nutzbar ist.
-
Das liegt an deiner if abfrage im Timer
Orten[playerid] = giveplayerid;
Orten[playerid] hat die Id welche geortet werden soll.
if(Orten[i] == 1)
Der Spiler könnte nur die ID 1 orten.Daher deklarier das Array Orten anderes und zwar so
new Orten[MAX_PLAYERS] = {-1,... };
somit hast du einen default wert
dann kannst du das so abfragen
if(Orten[i] != -1)Zu dem würde ich den Timer beenden wenn kein spieler irgend jemadn sucht und die verwendung von MAX_PLAYERS ist schneller als die funktion GetMaxPlayers zu benutzen
da MAX_PLAYERS ein define ist und ein konstanter wert.
jedoch macht es sinn MAX_PLAYERS deiner slotzahl anzupassen. -
Um dir mal bewusst zu machen das dein code reiner schrott ist.
format(Query, sizeof(Query), "SELECT `ID` FROM `sektor`");
Warum ein konstante in den string packen nur um ihn abzusenden wo ist der sinn dahinter ?Zu dem sendest du zwei querys ab einmal nur zum zählen das zweite beschränkt nur zum auslesen.
format(Query, sizeof(Query), "SELECT `ID` FROM `sektor`");
format(Query, sizeof(Query), "SELECT * FROM `sektor` WHERE `ID` = '%d' LIMIT 1",System[SektorOnline]+1);Nun das aller traurigste ist die for-schleife + die while-schleife
for(new i = 0; i <mysql_num_rows(); i++)die while-schleife in verbindung mit mysql_fetch_row oder mysql_fetch_row_format wo der einzigste Unterschied darin besteht das du den delimiter ändern kannst.
Geht durch alle Einträge durch und ließt diese je nach dem absgesendeten query aus, da mysql_fetch_row wie auch mysql_retrieve_row zur nächsten zeile springt falls diese vorhanden ist wird 1 zurück gegeben falls nicht 0 daher wird die while schleife auch abgebrochen.Zu dem benötigst du keine 1024 zeichen ich geh mal davon aus so grob gezählt reichen dort locker 100 Zeichen(ausgelesenen string die Zeichen durchzählen).
Ich hoffe du nimmst dir die Punkte zu herzen oder auch nicht.
stock CreateSektor()
{
new str[128],i;
mysql_query("SELECT * FROM `sektor`;");
mysql_store_result();
printf("%d Sektoren gelesen.", mysql_num_rows());
while(mysql_fetch_row(str))
{
sscanf(str, "e<p<|>{i}is[16]ffffd>",SektorInfo[i]);
Sektor[i] = GangZoneCreate(SektorInfo[i][sX1],SektorInfo[i][sY1],SektorInfo[i][sX2],SektorInfo[i][sY2]);
printf("Sektor %s[%d] geladen.\n%s", SektorInfo[i][sName],i,str);
++i;
}
mysql_free_result();
}//edit
Wenn du zum hochzählen System[SektorOnline] vorgesehen hast kannst du dies auch anstelle von i benutzen. -
Bitte hilft mir!
Das liegt daran das dein deklarierter string zu klein ist und nur 128 Zeichen maximal fassen kann. Jedoch benötigt der Sql-Befehl, welchen du ausführen lassen möchtest 351 zeichen.
Das resultat du sendest ein abgehacktes query an den mysql server, dieser kann den befehl nicht verarbeiten und es sollte dir eine Fehlermeldung ausgegeben werden in der mysqllog.
Solltest du die mysqllog nicht haben so liegt dies daran das du diese nicht unter OnGameModeInit aktiviert hast mit der funktion.mysql_log(LOG_DEBUG,LOG_TYPE_TEXT);
Dennoch kannst du die Fehler auch anzeigen lassen in der Konsole dazu einfach das callback OnQueryError hinzufügen.
public OnQueryError(errorid, error[], callback[], query[], connectionHandle) {
printf("Errorid %d",errorid);
print(error);
print(callback);
print(query);
return 1;
} -
Das ist möglich, jedoch benötigst du kenntnisse in Mathematik.
Dazu musst du erstmal ermitteln wohin der spieler schießt durch Cameraberechnungen.
siehe dazu
http://wiki.sa-mp.com/wiki/GetPlayerCameraFrontVectordanach musst du halt die position von den objekten auslesen und die größe um eine sogesehen virtuelle hitbox um das objekt zu erstellen
http://forum.sa-mp.com/showthread.php?t=407909nun solltest du nurnoch abgleichen ob sich das ganze schneidet.
Dazu kannst du dir ja mal Vektorenberechnungen anschauen.
Um das ganze noch zusammenzufassen berechnest du ob eine Gerade einen Körper schneidet,
-
Man sollte entweder die Callbacks hocken oder du fügst die funktionen einfach deinem gamemode hinzu.
-
Da ich einen kleinen Fehler gemacht habe beim komprimieren des alten arrays habe ich das ganze heute mal aktualisiert und kleine Unstimmigkeiten bei den skins auch beseitigt.
stock const static SkinArray[100]={
0x80200,0x140803,
0x200E06,0x401E0E,0x4C2411,0x582A14,0x643017,
0x70361A,0x803C1D,0x8C4421,0xA84A24,0xB4582B,
0xC05E2E,0xCC6431,0xE87234,0xF4783B,0x10C843E,
0x11C8C44,0x1389248,0x144A04F,0x150A652,0x17CBC56,
0x188C260,0x194C863,0x1A0CE66,0x1ACD469,0x1B8DA6C,
0x1C4E06F,0x1D0E672,0x1DCEC75,0x1E8F278,0x1F4F87B,
0x200FE7E,0x2190A84,0x2251087,0x2411E8E,0x2552692,
0x26D3499,0x27D3C9C,0x28942A0,0x29548A3,0x2A14EA6,
0x2B556AA,0x2C15EAE,0x2D166B1,0x2DD6CB5,0x2E972B8,
0x2F578BB,0x32D94C8,0x3419CCC,0x365A4D1,0x375BCDC,
0x391C6DF,0x3A9CCE5,0x3BDD8EB,0x3C9E2F0,0x3E5F0F7,
0x3F5F8FA,0x409FEFE,0x4160903,0x4261106,0x432170A,
0x43E1D0D,0x44A2310,0x4562913,0x4622F16,0x46E3519,
0x47A3B1C,0x486411F,0x4924722,0x49E4D25,0x4AE5328,
/////////////////////Männer//////////////////////
0x2C1409,0x7C1A0C,0xA04E26,
0xD86A29,0xFC7037,0x1148240,0x134984B,0x160AE55,
0x16CB459,0x204BA5C,0x2290682,0x235188B,0x2592891,
0x2753097,0x2C958A9,0x3017EBE,0x30D84C1,0x3198AC4,
0x33592C7,0x351A6CF,0x35DACD5,0x36DB4D8,0x389C2E0,
0x3A5D0E7,0x3CDDCED,0x3D9EAF4,0x40600FB,0x25507,
/////////////////////Frauen//////////////////////
};Dazu noch ein kleines define um die skins auszulesen
#define GetSkin(%0) ((SkinArray[(ArrayMarker[%0] >> 8)] >>> ((ArrayMarker[%0] & ~(0xFF<<8))*9))& ~(0xFFFFFF<<9))
Das ist sogesehen meine Basis für ein dynamisches Skinshopsystem, was ich irgendwann mal releasen werden je nachdem wie es mir zeitlich passt.
-
Also wie Logan bereits erwähnt hat du kannst das mit irgend welchen fremden vergessen. Da kommt es nur zu gezicke oder sonst was. Daher kann man das auch nur mit paar Kumpels durchziehen die sich kennen.
Aber das witzigste find ich ja immer die begründung wie solch eine gruppe an einem skript arbeiten soll. Die lösung ist ganz simple und zwar mit includes jeder schreibt sei eigene vom skript unabhängige include stichwort dazu hooking.
-
Wie Kaliber schon erwähnte ist es sehr sinnvoll. Ich mach diesauch zu dem hast du nicht nur eine bessere Überblick sondern kannst auch einfach Systeme entfernen oder bearbeiten ohne sich durch tausende zeilen zu kämpfen. Ein weitere Vorteil ist das erleichterte zusammen skripten jeder kümmert sich um ein system das letztendlich implementiert wird.
-
Dieser meinung stimme ich voll und ganz zu, warum sollte ich den leuten was erklären wenn sie es selber rausfinden können durch den code, somit denken sie ja wohl nach, wenn sie wollen..
Also wie hauke sagt, eigeninitiative zeigen, zudem falls fragen bestehen kann man die immer noch schritt weise beantworten.Genau das ist sogesehen auch das Problem "die Eigeninitiative zeigen". Es gibt Leute die mit dem kompletten Code mehranfangen können als einer ausgeschriebenen Erklärung.
Da sie diesen analysieren und vergleichen was sie falsch gemacht haben um die Lösung nachzuvollziehen. Andere hingegen kopieren den code raus und hoffen das es geht da bringt auch das spicken mit Kommentaren nix. Die meisten lesen sich ja nichtmal den Text den man verfasst hat durch sofern er nicht fett, rot und mit einer schriftgröße von 36px geschrieben ist, sondern sehen nur den Code. -
Deine ganzen Werke sehen wirklich gut aus und vor allem deine Signaturen.
-
++warum kommt mein Freund in mein Server, und dann sehe ich nur wie er rumsteht aber er sagt er bewegt sich und neben ihm ist so ein Ladezeichen also das er im Pausemenü oder so ist..
Wie mache ich das ich ihn wieder sehe er sieht mich auch nciht wie ich mich bewege..Dann wirst du wohl bei OnPlayerUpdate 0 returnen anstatt 1.
Weil über dieses Callback läuft die synchronisation mit anderen spielern. -
Deshalb sagte ich ja auch ich erwarte keine Großartige Bewertung wollte nur mal wieder was probieren und es evtl. als vorlage etc. bieten
Dazu würde es auch reichen wenn du nur die Images hier hochladen würdest und ich denke das jeder Depp in den Stileditor gehen und die Images ändern kann.
Also wenn du schon was probieren und als Vorlage veröffentlichen möchtest solltest du schon mehr bieten.
Darunter wäre wenigstens zu verstehen die Container zu ändern , MainMenu, Footer und den Main bereich um sich von dem Standartstil zu differenzieren. -
Also ich weiß auch nicht wie man sowas releasen,beziehungsweise dies als eigenes Design bezeichnen kann.
Du hast das Logo geändert und den Background das ist nix besonderes. Da hätte man weitaus mehr machen können.