Mit dieser API http://forum.sa-mp.com/showthread.php?t=104299
Ich habe sie schon mal benutzt, damals zu mindestens, komme jetzt aber nicht mehr mit ihre zurecht!
mfg ![]()
Mit dieser API http://forum.sa-mp.com/showthread.php?t=104299
Ich habe sie schon mal benutzt, damals zu mindestens, komme jetzt aber nicht mehr mit ihre zurecht!
mfg ![]()
Hallo!
Und zwar wollte ich mal fragen, wie ich am besten einen SAMP Online Status angehen soll, habs mit fsockopen nicht hinbekommen! (Es ging nicht)
mfg ![]()
Hallo!
Und zwar frage ich mich, wieso mein "Haus System" nicht Funktionieren will...
Hier ist mal der Code, in der DB wird ein Eintrag gemacht aber das Pickup erstellt er nicht wirklich, das gleiche gilt für das TextLabel!
Function OnHouseCreated(template_id, house_x, house_y, house_z, house_ix, house_iy, house_iz, house_ir, h_price, h_score, h_int)
{
hInfo[template_id][h_x] = house_x;
hInfo[template_id][h_y] = house_y;
hInfo[template_id][h_z] = house_z;
hInfo[template_id][h_ix] = house_ix;
hInfo[template_id][h_iy] = house_iy;
hInfo[template_id][h_iz] = house_iz;
hInfo[template_id][h_ir] = house_ir;
hInfo[template_id][h_preis] = h_price;
hInfo[template_id][h_level] = h_score;
hInfo[template_id][h_interior] = h_int;
CallLocalFunction("updateHouse", "ii", template_id, 0);
printf("OnHouseCreated: %i", cache_insert_id(Handle));
return hInfo[template_id][h_id] = cache_insert_id(Handle);
}
Function OnHouseLoad()
{
for(new i;i<cache_get_row_count(Handle);i++)
{
/*
h_level,
h_preis,
h_interior,
Text3D:h_text,
h_pickup,
h_besitzer[MAX_PLAYER_NAME],
h_rentable,
*/
if(cache_get_field_content_float(0, "h_x", Handle) == 0.0)continue;
//new id=getFreeHausID();
hInfo[i][h_x] = cache_get_field_content_float(i, "h_x", Handle);
hInfo[i][h_y] = cache_get_field_content_float(i, "h_y", Handle);
hInfo[i][h_z] = cache_get_field_content_float(i, "h_z", Handle);
hInfo[i][h_ix] = cache_get_field_content_float(i, "h_ix", Handle);
hInfo[i][h_iy] = cache_get_field_content_float(i, "h_iy", Handle);
hInfo[i][h_iz] = cache_get_field_content_float(i, "h_iz", Handle);
hInfo[i][h_ir] = cache_get_field_content_float(i, "h_ir", Handle);
hInfo[i][h_level] = cache_get_field_content_int(i, "h_level", Handle);
hInfo[i][h_interior] = cache_get_field_content_int(i, "h_interior", Handle);
hInfo[i][h_rentable] = cache_get_field_content_int(i, "h_rentable", Handle);
new tmp_name[MAX_PLAYER_NAME];
cache_get_field_content(i, "h_besitzer", tmp_name, Handle);
strmid(hInfo[i][h_besitzer], tmp_name, 0, sizeof(tmp_name), sizeof(tmp_name));
hInfo[i][h_id]=cache_get_field_content_int(i, "h_id", Handle);
CallLocalFunction("updateHouse","");
}
return 1;
}
Function updateHouse()
{
new string[256];
for(new houseid;houseid<sizeof hInfo;houseid++)
{
DestroyPickup(hInfo[houseid][h_pickup]);
Delete3DTextLabel(hInfo[houseid][h_text]);
if(!strlen(hInfo[houseid][h_besitzer]))
{
format(string, sizeof string, "[{0091FF}Haus zum Verkaufen{FFFFFF}]\n\nPreis: %i{0FFF00}$\n{FFFFFF}Level: %i\n\nGebe '{EBFF00}/buyhouse{FFFFFF}' ein um das Haus zu kaufen!",
hInfo[houseid][h_preis], hInfo[houseid][h_level]);
}
else if(strlen(hInfo[houseid][h_besitzer])>0)
{
if(!hInfo[houseid][h_rentable])
{
format(string, sizeof string, "[{0091FF}Haus zum Betrachten{FFFFFF}]\n\nBesitzer: %s\n\nDrücke '{EBFF00}ENTER{FFFFFF}' um das Haus zu betreten",
hInfo[houseid][h_besitzer]);
}
}
hInfo[houseid][h_pickup] = CreateDynamicPickup(1273, 1, hInfo[houseid][h_x], hInfo[houseid][h_y], hInfo[houseid][h_z], 0, hInfo[houseid][h_interior]);
hInfo[houseid][h_text] = Create3DTextLabel(string, COLOR_WHITE, hInfo[houseid][h_x], hInfo[houseid][h_y], hInfo[houseid][h_z], 25.0, 0, 1);
}
return 1;
}
mfg ![]()
Machs doch unter dem Callback OnPlayerWeaponShot
Einfach durch die Parameter genau auf dich zurecht schneiden und dann ein "return 0;" damit der Schuss nicht Synchronisiert wird.
Das ganze funktioniert leider nur mit Schusswaffen.
Das ganze wird doch nicht nur durch ein return 0, async oder ?
mfg ![]()
Was wird denn bei deinem Debug geprintet?
Ich habe das Problem bereits behoben, vielen Dank!
mfg ![]()
Du könntest auch http://wiki.sa-mp.com/wiki/SetPlayerTeam nutzen, siehe erste 'Note'.
Daran habe ich auch schon gedacht, habe ich ja bei den COPS auch so gemacht.
Polizisten können sich nicht gegenseitig beschädigen... ![]()
Nur, ich habe dort ein Bedenken!
Sagen wir ich gebe jedem Zivilist der keinen Wanted hat Team 2, Team 2 haben übrigens auch Mitglieder vom SFPD, dann können sich die Personen auch nicht verletzen wenn sie keine Wanteds haben.
mfg ![]()
Ich würd sagen, dass OnPlayerWeaponShot hierfür besser geeignet ist. Du musst berücksichtigen, dass bei OnPlayerTakeDamage der Spieler trotz dem Code Schaden erleidet, und dieser dann eben unmittelbare wieder beglichen wird.
Wie kann ich dann den Schaden ermitteln der entstanden ist?
mfg ![]()
Hallo!
Ich habe aktuell vor, den Spieler unverwundbar vor Polizisten zu machen wenn er keine Wanted's hat.
Mein aktueller Code:
Function OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
{
PlayerPlaySound(issuerid,17802,0.0,0.0,0.0);
new Float:h;
GetPlayerHealth(issuerid,h);
if(h>100.0) SetPlayerHealth(issuerid,100);
if(getPlayerTeam(issuerid) == TEAM_COPS && getPlayerTeam(playerid) == TEAM_ZIVI)
{
if(!getPlayerWanteds(playerid))
{
GetPlayerHealth(playerid,h);
SetPlayerHealth(playerid,h+amount);
}
return 1;
}
return 1;
}
Dies Funktioniert aber nicht einwandfrei, wie mache ich es nun dass das Fahrzeug und der Charakter an sich nicht beschädigt werden können?
mfg ![]()
Du hast mein zweiten Vorschlag nicht befolgt. Lasse dir beim erstellen eines Shops immer die business_id debuggen
Das heißt: Erstelle mehrmals Shops damit wir die business_id sehen, ob die sich verändert
Die Business ID ist beim Print immer 0, habe sie ausgeben lassen ![]()
mfg ![]()
Alles anzeigenstock getFreeBInfo()
{
for(new i;i<sizeof bInfo;i++)
{
if(!bInfo[i][b_x] && !bInfo[i][b_y] && !bInfo[i][b_z])return i;
}
return 0;
}
Schreibe die Funktion mal so.
Wenn das nicht klappen sollte, dann lasse dir mal business_id printen. (Hinweis: Debugge mehrmals, nicht nur einmal!)
#edit:
@CIBERKILLER: Besteht das Problem weiterhin?
#edit²:
Hast du das Problem lösen können?
Nein, habe das Problem nicht lösen können und es bestehen weiterhin Probleme.
mfg ![]()
Das man Crasht hat doch nichts mit dem Server zu tun oder irre ich mich da
Nein, du irrst dich da nicht.
Dennoch gibt es PAWN Fehler die man machen kann damit ein Crash erzeugt wird. -> Diese sind in der WIKI mit einem Warning markiert.
Zeig uns mal dein OnPlayerConnect Callback.
#Handy
mfg ![]()
Wenn man Pawnstar im Pawno Ordner hat, crasht Pawnstar!
mfg ![]()
Lässt du die Benutzerkonten via MySQL Speichern ?
mfg ![]()
Function getFreeBInfo()
{
for(new i;i<sizeof bInfo;i++)
{
if(bInfo[i][b_x] == 0.0)return i;
}
return -1;
}
mfg ![]()
Hey!
Und zwar habe ich mich an einen Befehl gesetzt, der nennt sich /createshop.
Damit soll es möglich sein, Ingame Geschäfte zu erstellen, verwalten und zu entfernen...
Aktuell besteht der Fehler das wenn ich mehrere Geschäfte erstelle, das die Koordinaten vom ersten Geschäft entnommen wird.
PWN CODE
Function CreateShop(playerid, world, shopname[], Float:c_x, Float:c_y, Float:c_z)
{
//"24/7 Shop\nAmmunation\nBinco\nVictim\nZip\nBurger Shot\nClucking Bell\nWell Stack Pizza"
new interior_id, Float:pos[3];
if(!strcmp(shopname,"24/7",true))
{
interior_id = 10;
pos[0]=6.091179;
pos[1]=-29.271898;
pos[2]=1003.549438;
}
else if(!strcmp(shopname,"Ammunation",true))
{
interior_id = 1;
pos[0]=286.800994;
pos[1]=-82.547599;
pos[2]=1001.515625;
}
else if(!strcmp(shopname,"Binco",true))
{
interior_id = 15;
pos[0]=207.737991;
pos[1]=-109.019996;
pos[2]=1005.132812;
}
else if(!strcmp(shopname,"Victim",true))
{
interior_id = 10;
pos[0]=6.091179;
pos[1]=-29.271898;
pos[2]=1003.549438;
}
else if(!strcmp(shopname,"Zip",true))
{
interior_id = 5;
pos[0]=226.293991;
pos[1]=-7.431529;
pos[2]=1002.210937;
}
else if(!strcmp(shopname,"Burger Shot",true))
{
interior_id = 10;
pos[0]=375.962463;
pos[1]=-65.816848;
pos[2]=1001.507812;
}
else if(!strcmp(shopname,"Clucking Bell",true))
{
interior_id = 9;
pos[0]=369.579528;
pos[1]=-4.487294;
pos[2]=1001.858886;
}
else if(!strcmp(shopname,"Well Stack Pizza",true))
{
interior_id = 5;
pos[0]=373.825653;
pos[1]=-117.270904;
pos[2]=1001.499511;
}
printf("CreateShop -> world:%i,shopname:%s,pos:%f,%f,%f playerid: %i | interiorid: %i", world, shopname, c_x, c_y, c_z, playerid, interior_id);
new query[450];
mysql_format(Handle, query, sizeof query, "INSERT INTO Business (b_x, b_y, b_z, b_ix, b_iy, b_iz, b_vw, b_int, b_shopname) VALUES (%f, %f, %f, %f, %f, %f, %i, %i, '%s')",
c_x, c_y, c_z, pos[0], pos[1], pos[2], world, interior_id, shopname);
mysql_pquery(Handle, query, "", "");
new business_id = getFreeBInfo();
bInfo[business_id][b_x] = c_x;
bInfo[business_id][b_y] = c_y;
bInfo[business_id][b_z] = c_z;
bInfo[business_id][b_ix] = pos[0];
bInfo[business_id][b_iy] = pos[1];
bInfo[business_id][b_iz] = pos[2];
bInfo[business_id][b_int] = interior_id;
bInfo[business_id][b_vw] = world;
new string[128];
format(string, sizeof string, "[{00E1FF}%s{FFFFFF}]\nDrücke 'ENTER' um den Laden zu betreten", shopname);
Create3DTextLabel(string, COLOR_WHITE, c_x, c_y, c_z, 20.0, 0, 1);
CreateDynamicPickup(19197, 1, c_x, c_y, c_z, 0, 0);
CreateDynamicPickup(19197, 1, pos[0], pos[1], pos[2], world, interior_id);
return SendClientMessage(playerid, COLOR_GREEN, "** Du hast erfolgreich einen Laden erstellt **");
}
mfg ![]()
Hey!
Weiß jemand wie ich die Funktion am besten in ein Makro umschreiben kann?
Function SendClientMessageToRange(playerid, color_code, Float:range_max, ms_g[])
{
new Float:ms_g_p[3];
GetPlayerPos(playerid,ms_g_p[0],ms_g_p[1],ms_g_p[2]);
for(new i;i<GetMaxPlayers();i++)
{
if(!IsPlayerConnected(i) || IsPlayerNPC(i))continue;
if(GetPlayerDistanceFromPoint(i, ms_g_p[0], ms_g_p[0], ms_g_p[0]) > range_max)continue;
SendClientMessage(i, color_code, ms_g);
}
return 1;
}
mfg ![]()
Dann musst du es so schreiben:
static x = sizeof(SKINS_ZIVI)-1;
if(x == -1) x=sizeof(SKINS_ZIVI)-1;
SetPlayerSkin(playerid,SKINS_ZIVI[x]),x--;
mfg.
Funktioniert nicht ganz...
Und @lcy. ..wenn ich die Rechte Pfeiltaste verwende..dann switcht er bei OnPlayerUpdate 2x ![]()
mfg ![]()
Als erstes muss das so:
static x;
if(x == sizeof(SKINS_ZIVI)) x=0;
SetPlayerSkin(playerid,SKINS_ZIVI[x]),x--;
Die Pfeiltasten werden nicht über OnPlayerKeyStateChange aufgerufen, sondern die musst du mit OnPlayerUpdate abfragen.
Das ganze kannst du mit GetPlayerKeys anstellen
Ich weiß, habe ich bereits gemacht.
Über OnPlayerUpdate läuft mir das zu "Hyper aktiv " ab ..... ![]()
if(GetPVarInt(playerid,"SkinC"))
{
new key[3];
GetPlayerKeys(playerid, key[0], key[1], key[2]);
switch(key[2])
{
case KEY_RIGHT:
{
static x;
if(x == sizeof(SKINS_ZIVI)) x=1;
SetPlayerSkin(playerid,SKINS_ZIVI[x]),x++;
/*if(getPlayerTeam(playerid) == TEAM_ZIVI)
{
switch(GetPlayerSkin(playerid))
{
case 1:SetPlayerSkin(playerid,2);
case 2:SetPlayerSkin(playerid,3);
case 3:SetPlayerSkin(playerid,4);
case 4:SetPlayerSkin(playerid,5);
case 5:SetPlayerSkin(playerid,6);
case 6:SetPlayerSkin(playerid,7);
case 7:SetPlayerSkin(playerid,8);
case 8:SetPlayerSkin(playerid,14);
case 14:SetPlayerSkin(playerid,15);
case 15:SetPlayerSkin(playerid,16);
case 16:SetPlayerSkin(playerid,17);
case 17:SetPlayerSkin(playerid,18);
case 18:SetPlayerSkin(playerid,19);
case 19:SetPlayerSkin(playerid,20);
case 20:SetPlayerSkin(playerid,21);
case 21:SetPlayerSkin(playerid,22);
case 22:SetPlayerSkin(playerid,23);
case 23:SetPlayerSkin(playerid,24);
case 24:SetPlayerSkin(playerid,25);
case 25:SetPlayerSkin(playerid,26);
case 26:SetPlayerSkin(playerid,27);
case 27:SetPlayerSkin(playerid,28);
case 28:SetPlayerSkin(playerid,29);
case 29:SetPlayerSkin(playerid,30);
}
}*/
}
case KEY_LEFT:
{
static x;
if(x == sizeof(SKINS_ZIVI)) x=1;
SetPlayerSkin(playerid,SKINS_ZIVI[x]),x--;
/*if(getPlayerTeam(playerid) == TEAM_ZIVI)
{
switch(GetPlayerSkin(playerid))
{
case 30:SetPlayerSkin(playerid,29);
case 29:SetPlayerSkin(playerid,28);
case 28:SetPlayerSkin(playerid,27);
case 27:SetPlayerSkin(playerid,26);
case 26:SetPlayerSkin(playerid,25);
case 25:SetPlayerSkin(playerid,24);
case 24:SetPlayerSkin(playerid,23);
case 23:SetPlayerSkin(playerid,22);
case 22:SetPlayerSkin(playerid,21);
case 21:SetPlayerSkin(playerid,20);
case 20:SetPlayerSkin(playerid,19);
case 19:SetPlayerSkin(playerid,18);
case 18:SetPlayerSkin(playerid,17);
case 17:SetPlayerSkin(playerid,16);
case 16:SetPlayerSkin(playerid,15);
case 15:SetPlayerSkin(playerid,14);
case 14:SetPlayerSkin(playerid,8);
case 8:SetPlayerSkin(playerid,7);
case 7:SetPlayerSkin(playerid,6);
case 6:SetPlayerSkin(playerid,5);
case 5:SetPlayerSkin(playerid,4);
case 4:SetPlayerSkin(playerid,3);
case 3:SetPlayerSkin(playerid,2);
case 2:SetPlayerSkin(playerid,1);
}
}*/
}
}
}
Glaube ein Timer wäre dafür angebracht ..
mfg ![]()
Alles anzeigenjetzt so als Beispiel.
Schreib das mal so:
//Oben im Skript
stock const skins[] = {
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
};
//In deinem Callback
static x;
if(x == sizeof(skins)) x=0;
SetPlayerSkin(skins[x]),x++;
mfg.
Gut, ist soweit Funktionstüchtig.
Aber wenn ich das ganze zurücklaufen lassen will?
static x;
if(x == sizeof(SKINS_ZIVI)) x=1;
SetPlayerSkin(playerid,SKINS_ZIVI[x]),x--;
So Funktioniert das nicht ![]()
Außerdem mal ne frage nebenbei, wenn man die Pfeiltasten benutzt..wird dann OnPlayerKeyStateChange aufgerufen?
mfg ![]()
Ich bin hier gerade mächtig am überlegen wie man eine Variable durchgeht.
Ist nützlich für meine Skin Auswahl.
PWN CODE:
new skins[16][1] = {
{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},
};
for(new i;i<sizeof skins;i++)
{
if(GetPlayerSkin(playerid) == skins[i]){
SendClientMessage(playerid, -1, "Du warst auf dem Wert bereits, der Integer wird erhöht.");
SetPlayerSkin(playerid,skins[i+1]);
}
}
Ich weiß aber nicht direkt ob ich das richtig angehe, habt ihr bessere Vorschläge?
Das soll heißen, das ich am ende mit der Rechten und Linken Pfeiltaste den Skin 1-15 Switchen kann, jetzt so als Beispiel.
mfg ![]()