Ist schon so drinne (sieht man nur nicht im Video ),du gehst nur noch raus wenn du im Dialog bist wo alle Items sind, werde ich gleich anpassen das dort zurück steht und nicht mehr abbrechen .
Beiträge von Mogly1
-
-
Stimmt FindClosestVeh hatte nicht das nächste ausgegeben ^^, habe es jetzt gleich angepasst damit man nun den 'ClosestTrunk' bekommt . (Hatte ich gar nicht mehr auf den schirm)
GangstaSunny habe deine Vorschläge, best möglich versucht mit einzubauen, habe es editiert und ein neues Video hinzugefügt.
Kaliber Ich werde mir das mit dem Include mal ansehen, habe noch nie eins geschrieben (glaube ich) und das mit for(new i=1;i<MAX_SLOTS;i++) wurde auch angepasst danke für den Hinweis.
MfG. Mogly1
-
Danke für das Feedback und die ganzen ansetz stellen.
Ich werde das mal noch alles anpassen .
Auf jeden Fall danke, das du dir den Code mal angesehen hast
Nur eine Anmerkung bei
- Bei new id = strval(inputtext); kann theoretisch sonst was bei rumkommen. Du solltest also vorher validieren ob der User auch eine Zahl eingeben hat.
laut https://wiki.sa-mp.com/wiki/Strval
' The integer value of the string. '0 if the string is not numeric.'Somit sollte da nix falsches bei raus kommen da wenn es keine zahl ist eine 0 ist, falls dir eine Eingabe auffällt die dennoch geht würde mich das mal interessieren mfg. Mogly1.
-
Guten Tag, auf nachfrage bei mir habe ich ein Kofferraum mit einem kleinem Item system gebastelt.
Da ich lange nix mehr mit Pawn zutun hatte ist der Code wohl nicht so der Optimalste.
Aber evt. können andere dieses System ja noch gebrauchen oder verbessern.
Hier ein Video dazu:
Externer Inhalt www.youtube.comInhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.und hier der Code:
Mit MAX_SLOTS gebt ihr die Allgemeine menge an Items an die man Pro Slot im vehicle hat und mit MAX_MASS wie viel man im Auto lagern kann Bsp. 300 Schuss mit der Deagle oder 300 Drogen...
Derzeitige Items, Drogen(allgemein) id=100 und Materialien(Allgemein) id=101 weiters leicht einzufügen,wenn man sich kurz rein liest.
Wenn jemand gerade am Kofferraum ist, kann kein weiterer ihn benutzen um Bugs zu vermeiden.
Anmerkung: fügt ClearKofferraum(vehicleid); hinzu bei den Fahrzeugen die Spawnen oder geht es einmal am start mit einer for schleife durch alle Autos durch, je nach dem wie ihr es dann braucht.
Ich hoffe das Denglisch verwirrt nicht.
Code
Alles anzeigen#define MAX_MASS 300 #define MAX_SLOTS 10 #define DRUG_ID 100 #define MATS_ID 101 #define MAX_ITEM_NAME_LENGTH 50 native IsValidVehicle(vehicleid); //oder per #define enum { DIALOG_TRUNK, DIALOG_TRUNK_OUTPUT_MATS, DIALOG_TRUNK_OUTPUT_DRUGS, DIALOG_TRUNK_INPUT_MATS, DIALOG_TRUNK_INPUT_DRUGS, DIALOG_TRUNK_INPUT } //KofferraumSys enum KofferraumEnum { mass, name[MAX_ITEM_NAME_LENGTH], item_id //Waffenids, 100 für Drogen(allgemein gehalten), 101 für Mats(allgemein gehalten) } new Kofferraum[MAX_VEHICLES][MAX_SLOTS][KofferraumEnum]; enum VInf { max_mass, bool:used_kofferraum, actual_mass } new VehInfo[MAX_VEHICLES][VInf]; //der Befehl public OnPlayerCommandText(playerid, cmdtext[]) { if(strcmp("/kofferraum", cmdtext, true) == 0) { new veh = FindClosestTrunk(playerid); if(veh!=-1) { if(VehInfo[veh][used_kofferraum])return SendClientMessage(playerid,-1,"Der Kofferraum wird gerade genutzt..."); SetPVarInt(playerid,"VID",veh); VehInfo[veh][used_kofferraum]=true; ShowTrunk(playerid,veh); new engine, lights, alarm, doors, bonnet, boot, objective; GetVehicleParamsEx(veh, engine, lights, alarm, doors, bonnet, boot, objective); SetVehicleParamsEx(veh, engine, lights, alarm, doors, bonnet, VEHICLE_PARAMS_ON, objective); } else { SendClientMessage(playerid,-1,"Du befindest dich nicht an einem Kofferraum."); } return 1; } return 0; } //die Functions /*Position hinter kofferraum kopiert von https://forum.sa-mp.com/showthread.php?t=453546 */ stock GetXYBehindVehicle(vehicleid, &Float:x2, &Float:y2, Float:distance) { new Float:a; GetVehiclePos(vehicleid, x2, y2, a); GetVehicleZAngle(vehicleid, a); x2 += (distance * floatsin(-a+180, degrees)); y2 += (distance * floatcos(-a+180, degrees)); return 1; } stock GetTrunkPos(vehicleid, &Float: x3, &Float:y3, &Float:z3) { new Float: x, Float: y; new Float: sizeX, Float: sizeY, Float:sizeZ[2]; GetVehicleModelInfo(GetVehicleModel(vehicleid), VEHICLE_MODEL_INFO_SIZE, sizeX, sizeY, sizeZ[0]); GetXYBehindVehicle(vehicleid, x, y, sizeY/2); x3 = x; y3 = y; GetVehicleModelInfo(GetVehicleModel(vehicleid), VEHICLE_MODEL_INFO_REAR_BUMPER_Z , sizeX, sizeY, sizeZ[1]); z3 = (sizeZ[1] + sizeZ[0]/2); return 1; } stock ShowTrunk(playerid,veh) { CheckSlots(veh); new string[250]; for(new i=0;i<MAX_SLOTS;i++) { if(Kofferraum[veh][i][item_id]==0)continue; format(string,sizeof(string),"%s\n%d\t%s\t%d",string,Kofferraum[veh][i][item_id],Kofferraum[veh][i][name],Kofferraum[veh][i][mass]); } format(string,sizeof(string),"Item id\tName\tAnzahl\n%s\n0\tItem einlagern\t0",string); new header[50]; format(header,sizeof(header),"Kofferraum (%d/%d)",VehInfo[veh][actual_mass],VehInfo[veh][max_mass]); ShowPlayerDialog(playerid,DIALOG_TRUNK,DIALOG_STYLE_TABLIST_HEADERS,header,string,"Auswählen","Abbrechen"); return 1; } stock CloseTrunk(playerid,veh) { new engine, lights, alarm, doors, bonnet, boot, objective; GetVehicleParamsEx(veh, engine, lights, alarm, doors, bonnet, boot, objective); SetVehicleParamsEx(veh, engine, lights, alarm, doors, bonnet, VEHICLE_PARAMS_OFF, objective); VehInfo[veh][used_kofferraum]=false; SendClientMessage(playerid,-1,"Du hast den Kofferraum geschlossen."); DeletePVar(playerid,"VID"); return 1; } stock StoreItem(playerid,vehid,id,menge,itemName[]) { new freeslot = GetFreeSlot(vehid); if(menge < 1)return SendClientMessage(playerid,-1,"Du musst schon etwas im Fahrzeug ablegen."); if(freeslot == -1)return SendClientMessage(playerid,-1,"Keinen Platz mehr im Fahrzeug."); if(VehInfo[vehid][max_mass]<VehInfo[vehid][actual_mass]+menge)return SendClientMessage(playerid,-1,"Im Fahrzeug passt nix mehr rein."); new string[125]; format(string,sizeof(string),"Du legst %d %s in den Kofferraum.",menge,itemName); if(id<=46) { GivePlayerWeapon(playerid,id,-menge); format(string,sizeof(string),"Du legst %s mit %d Munition in den Kofferraum.",itemName,menge); } VehInfo[vehid][actual_mass]+=menge; Kofferraum[vehid][freeslot][item_id]=id; Kofferraum[vehid][freeslot][mass]=menge; strmid(Kofferraum[vehid][freeslot][name],itemName,0,MAX_ITEM_NAME_LENGTH,MAX_ITEM_NAME_LENGTH); SendClientMessage(playerid,-1,string); return 1; } stock TakeItem(playerid,veh,menge) { new listid = GetPVarInt(playerid,"ListId"); DeletePVar(playerid,"ListId"); if(Kofferraum[veh][listid][mass]<menge || menge < 0)return SendClientMessage(playerid,-1,"So viel ist nicht im Wagen."); new string[125]; format(string,sizeof(string),"Du hast %d von %s entnommen.",menge,Kofferraum[veh][listid][name]); SendClientMessage(playerid,-1,string); GivePlayerItem(playerid,Kofferraum[veh][listid][item_id],Kofferraum[veh][listid][mass]); VehInfo[veh][actual_mass]-=menge; Kofferraum[veh][listid][mass]-=menge; if(Kofferraum[veh][listid][mass]==0) { Kofferraum[veh][listid][item_id]=0; } return 1; } stock GivePlayerItem(playerid,id,amount) { if(id==DRUG_ID)//Drogen { //pInfo[playerid][drugs]+=amount; Bsp. } else if(id==MATS_ID)//Mats { //pInfo[playerid][mats]+=amount; Bsp. } else//Waffen { GivePlayerWeapon(playerid,id,amount); } } stock CheckSlots(veh) { for(new i=0;i<MAX_SLOTS-1;i++) { if(Kofferraum[veh][i][item_id]==0) { Kofferraum[veh][i][item_id]=Kofferraum[veh][i+1][item_id]; Kofferraum[veh][i][mass]=Kofferraum[veh][i+1][mass]; strmid(Kofferraum[veh][i][name],Kofferraum[veh][i+1][name],0,MAX_ITEM_NAME_LENGTH,MAX_ITEM_NAME_LENGTH); Kofferraum[veh][i+1][item_id]=0; Kofferraum[veh][i+1][mass]=0; } } return 1; } stock GetFreeSlot(veh) { for(new i=0;i<MAX_SLOTS;i++) { if(Kofferraum[veh][i][item_id]==0)return i; } return -1; } stock ClearKofferraum(veh) { VehInfo[veh][actual_mass]=0; VehInfo[veh][max_mass]=MAX_MASS; for(new i=0;i<MAX_SLOTS;i++) { Kofferraum[veh][i][item_id]=0; Kofferraum[veh][i][mass]=0; strmid(Kofferraum[veh][i][name],"",0,MAX_ITEM_NAME_LENGTH,MAX_ITEM_NAME_LENGTH); } return 1; } stock FindClosestTrunk(playerid) { new Float:closestDistance=3.0; new veh=-1; for(new i=0;i<MAX_VEHICLES;i++) { if(!IsValidVehicle(i))continue; new Float:x, Float:y, Float:z; GetTrunkPos(i, x, y, z); new Float:distance = GetPlayerDistanceFromPoint(playerid, x,y,z); if(closestDistance>distance) { closestDistance=distance; veh = i; } } return veh; } // Dialoge public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { switch(dialogid) { case DIALOG_TRUNK: { if(response) { new id = strval(inputtext); if (!sscanf(inputtext, "d", id)) { SetPVarInt(playerid,"ListId",listitem); if(id == 0) { ShowPlayerDialog(playerid,DIALOG_TRUNK_INPUT,DIALOG_STYLE_LIST,"Items","Drogen\nMats\nWaffe","Auswählen","Abbrechen"); } else if (id == DRUG_ID) { ShowPlayerDialog(playerid,DIALOG_TRUNK_OUTPUT_DRUGS,DIALOG_STYLE_INPUT,"Drogen","Wie viele Drogen willst du entnehmen?","Auswählen","Zurück"); } else if (id == MATS_ID) { ShowPlayerDialog(playerid,DIALOG_TRUNK_OUTPUT_MATS,DIALOG_STYLE_INPUT,"Materialien","Wie viele Materialien willst du entnehmen?","Auswählen","Zurück"); } else { new veh = GetPVarInt(playerid,"VID"); new string[125]; format(string,sizeof(string),"Du hast %s entnommen",Kofferraum[veh][listitem][name]); SendClientMessage(playerid,-1,string); GivePlayerItem(playerid,Kofferraum[veh][listitem][item_id],Kofferraum[veh][listitem][mass]); VehInfo[veh][actual_mass]-=Kofferraum[veh][listitem][mass]; Kofferraum[veh][listitem][item_id]=0; Kofferraum[veh][listitem][mass]=0; ShowTrunk(playerid,veh); return 1; } } } else { new veh = GetPVarInt(playerid,"VID"); CloseTrunk(playerid,veh); return 1; } } case DIALOG_TRUNK_OUTPUT_DRUGS: { new veh = GetPVarInt(playerid,"VID"); if(response) { TakeItem(playerid,veh,strval(inputtext)); ShowTrunk(playerid,veh); } else { ShowTrunk(playerid,veh); } } case DIALOG_TRUNK_OUTPUT_MATS: { new veh = GetPVarInt(playerid,"VID"); if(response) { TakeItem(playerid,veh,strval(inputtext)); ShowTrunk(playerid,veh); } else { ShowTrunk(playerid,veh); } } case DIALOG_TRUNK_INPUT: { if(response) { if(listitem==0) { ShowPlayerDialog(playerid,DIALOG_TRUNK_INPUT_DRUGS,DIALOG_STYLE_INPUT,"Drogen","Wie viele Drogen willst du einpacken?","Auswählen","Zurück"); } if(listitem==1) { ShowPlayerDialog(playerid,DIALOG_TRUNK_INPUT_MATS,DIALOG_STYLE_INPUT,"Materialien","Wie viele Materialien willst du einpacken?","Auswählen","Zurück"); } if(listitem==2) { new vehicle = GetPVarInt(playerid,"VID"); new weapons[13][2]; for (new i = 0; i <= 12; i++) { GetPlayerWeaponData(playerid, i, weapons[i][0], weapons[i][1]); if(GetPlayerWeapon(playerid)==weapons[i][0] && GetPlayerWeapon(playerid)!=0) { new weapname[32]; GetWeaponName(weapons[i][0],weapname,sizeof(weapname)); StoreItem(playerid,vehicle,weapons[i][0],weapons[i][1],weapname); ShowTrunk(playerid,vehicle); return 1; } } ShowTrunk(playerid,vehicle); return SendClientMessage(playerid,-1,"Du hast keine Waffe ausgerüstet."); } } else { new vehicle2 = GetPVarInt(playerid,"VID"); CloseTrunk(playerid,vehicle2); return 1; } } case DIALOG_TRUNK_INPUT_DRUGS: { new veh = GetPVarInt(playerid,"VID"); if(response) { StoreItem(playerid,veh,DRUG_ID,strval(inputtext),"Marihuana"); ShowTrunk(playerid,veh); return 1; } else { ShowTrunk(playerid,veh); } } case DIALOG_TRUNK_INPUT_MATS: { new vehid = GetPVarInt(playerid,"VID"); if(response) { StoreItem(playerid,vehid,MATS_ID,strval(inputtext),"Material"); ShowTrunk(playerid,vehid); return 1; } else { ShowTrunk(playerid,vehid); } } } return 1; }
Items hinzufügen simple erklärt:
1) Zu erst Definiert ihr ein neues Item oben in define, Ich verwende hier nun immer NEW_ITEM, passt dies bitte an
2020-03-11 17_42_24-showroom.pwn - Pawno.png
2) Danach fügt ihr 2 neue Dialoge ein zumindest, wenn ihr es so wie bei Drugs und Mats machen wollt.
2020-03-11 17_44_27-showroom.pwn - Pawno.png
3) Dann geht ihr unter OnDialogResponse sucht ihr dann den DIALOG_TRUNK und geht dort zu if(id == 0) und fügt euer neues Item in die Liste ein
2020-03-11 17_45_58-showroom.pwn - Pawno.png
4.1) Danach bleibt ihr in DIALOG_TRUNK und fügt unter else if (id == MATS_ID) eine weiter else if mit eurem neuen Item ein und derstell gleich den Dialog
2020-03-11 17_43_19-showroom.pwn - Pawno.png
4.2) nun geht ihr unter DIALOG_TRUNK_INPUT und fügt ein neues listitem hinzu für euer item
2020-03-11 17_46_51-showroom.pwn - Pawno.png
5) Dann könnt ihr euch den DIALOG_TRUNK_OUTPUT_DRUGS kopieren und euer neues Item damit ersetzen
2020-03-11 17_45_26-showroom.pwn - Pawno.png
6) Das selbe mit DIALOG_TRUNK_INPUT_DRUGS
2020-03-11 17_47_31-showroom.pwn - Pawno.png
7) So fast geschafft, nun geht ihr unter StoreItem
und fügt, wenn nötig eine abfrage hinzu wenn ihr etwas bestimmtes tun wollt, wenn das Item von euch in den Kofferraum gelegt wird, Bsp bei der Waffe, müssen wir ihn sie entziehen. Wie gesagt nur wenn es nötig ist ansonsten keine if hinzufügen.
2020-03-11 17_48_42-showroom.pwn - Pawno.png
Und am ende fügt ihr es bei GivePlayerItem
hinzu über der letzten else also so
2020-03-11 17_50_30-showroom.pwn - Pawno.png
9) Nun sollte es in game dann so aussehen bzw. Fnktioneiren.
Mfg. Mogly1
-
Ich bin mir nicht ganz sicher aber schau mal wenn du das Komma vor dem WHERE weg nimmst ob es dann geht?
Also das,
UPDATE user SET level = '%d', money = '%d',kills = '%d', deaths ='%d', arang = '%d', WHERE id = '%d
zu dem
UPDATE user SET level = '%d', money = '%d',kills = '%d', deaths ='%d', arang = '%d' WHERE id = '%d -
So habe ich versucht es anzuwenden:
Cif((newstate == PLAYER_STATE_DRIVER) || (newstate == PLAYER_STATE_PASSENGER)) { new string[32], idx = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400; vehData[idx][e_km] += GetKilometers(idx); format(string, sizeof(string), "%0.2f", vehData[idx][e_km]); PlayerTextDrawSetString(playerid, textdraw[11][playerid], string); }
Allerdings passiert nichts, was mache ich falsch, oder habe ich was übersehen?
Ja, schau mal du nutzt idx nicht als vehicleid sonder als Model!?
Das bedeutet jedes Modell hat den selben Kilometer!?Ich meine laut dem Include brauchst du auch die vehicleid siehe:
GetKilometers(vehicleid);...............Checks the distance traveled in kilometers
und das mit vehData wird wahrscheinlich auch über vehicleid laufen, bzw. sollte?
falls nicht bitte ich mal um erklärung damit ich das nachvollziehen kann.
Mfg. Mogly1Also sollte es doch eifnach nur so sein
idx = GetPlayerVehicleID(playerid);
und dann sollte das gehen oder nicht ? -
Du nimmst Glas und dann setzt du da Fische rein bzw pflanzen fertig
im Notfall das glas evt. eine bläuliche Textur geben.
Mfg. Mogly1 -
Yut habe mir jetzt mal alles angeschaut und änder mal bitte dein OnUserCheck zu dem hier
forward OnUserCheck(playerid);
public OnUserCheck(playerid)
{
printf("rows %d",cache_num_rows());
if(cache_num_rows() == 0)
{
print("11");
PlayerIsNotRegistered(playerid);
ShowLoginTextDraws(playerid);
}
else
{
print("12");
PlayerIsRegistered(playerid);
ShowLoginTextDraws(playerid);
}
return 1;
}
Anscheinend hatte er hier gemeckert
new rows;
cache_get_row_count(rows);aber da dir diese Funktion hier genau das gibt was du haben willst
habe ich sie einfach mal ersetzt und es ging dann.
die Funktion
cache_num_rows()Mfg. Mogly1
Edit: eingerückt -
setzt du die varaible auch irgendwo?
pRegistered[playerid]Edit: schuldige ist im include drinne Mein Fehler
Edit2:
evt. Spalte anders genannt? also hier kein Fehler ja?
mysql_format(handle, query, sizeof(query), "SELECT uID FROM account_list WHERE Name = '%e'", SpielerInfo[playerid][pName]); -
2. Rocky - Lebende Forenlegende und aktives Schreiberlein - Wette: Wann erreicht er 5000 Beiträge ? - Deadline: 31.12.2019
3. Seegras - Teammitglied und aktiver Kommentator - Wette: Wann erreicht er 4500 Likes ? - Deadline 31.12.2019Ich bin nicht ganz in der Materie drinne bei diesen 2 Personen aber mein Gefühl sagt mir....
Rocky 08.10.2019 Seegras 21.06.2019 -
Damit hat @SynonymousZ wohl gewonnen.
Macht wenig Sinn wenn 2 Leute das gleiche Datum wählen, wenn es nur einen Gewinn gibt
- Es gewinnt derjenige der am nächsten zum tatsächlichen Eintrittsdatum liegt, fällt kein Ban und/oder es liegen mehrere Leute richtig findet eine Auslosung durch einen Mittelsmann statt.
Also doch c(:
-
3 Gold angemalte Steine werden auf einen Bann gegen innerhalb der Deadline gesetzt
-
Ab einer gewissen Geschwindigkeit fliegt das Auto raus... liegt an Gta Samp,
Soweit meine Erfahrung sind...Aber du könntest abfragen, falls es raus bugt, ob es in der Reichweite vom Fahrzeug ist und wenn nicht, setzt du es wieder rein, es sieht dann aber etwas komisch aus
-
Du kansnt das Thema als erledigt markieren fertig
-
hier 1 Frage c(:
Graff3D
graffity
sind das globale variablen?Bzw. müssen sie ja laut deinem erstell ding.... bedeutet diese variablen sind genau das Tag was du zu letzt erstellt hast...
(falls es globale Variablen sind)Edit:
Warum nutzt du beim erstellen der tags kein
CreateObject
SetObjectMaterialText
?Edit2:
Schuldige bitte ganz vergessen noch zu schreiben, ändere mal das so ab..
new Graff3D[MAX_GRAFFITI];
new graffity[MAX_GRAFFITI];
und nutze das dann mal bitte jeweils in den sachen wo es steht so
Graff3D[i] =..
graffity[i] =...
Also so dann ca.
graffity[i] =CreateObject(19482,dini_Float(file,"Graffiti X"),dini_Float(file,"Graffiti Y"),dini_Float(file,"Graffiti Z"),dini_Float(file,"Graffiti RotX"),dini_Float(file,"Graffiti RotY"),dini_Float(file,"Graffiti RotZ"),0.0);
Graff3D[i] =Create3DTextLabel(tagname,COLOR_ORANGE,dini_Float(file,"Graffiti X"),dini_Float(file,"Graffiti Y"),dini_Float(file,"Graffiti Z"),7,0,0);
DestroyObject(graffity[i]);
Delete3DTextLabel(Graff3D[i]);
sollte dann eig. gehen? -
Nein, das wird ja nicht oft geupdatet und das sind ja auch nicht viele Objekte.
Generell sollte das keine großen Auswirkungen haben.Mit dem Profiler Plugin: https://forum.sa-mp.com/showthread.php?t=271129
Kann man das übrigens theoretisch sehr gut erfassen
Hier hab es mal ca. 20min auf dem Server getestet mit 40 kühen und 4 Farmen also jeweils 10 kühe auf 1 farm mit futter
ist das jetzt viel oder mittel mäßiger verbauch? kann damit nicht viel anfangen also mit den %
@Kaliber
2019-05-10 20_40_11-Window.png -
Wenn du mit einem Timer arbeitest musst du forward und public nutzen.
sonst wird er eig. nicht aufgerufen.Verweis auf orange/gelbe Box
https://wiki.sa-mp.com/wiki/SetTimerEx -
Welche rotatiosn Achse denn genau?
Bzw. du nutz hier oben bei Create
0.000000, 90.000000, -98.799995,
-98und beim MoveDynamicObjectRot
setzt du diese Achse auf +90 meinst du evt. diese Drehung? -
Sehr schönes System!
Es ist wirklich was ganz gutes, was ich nur bewundern kann ♥
Mich interessiert in wie fern es Auswirkung auf die Performance vom Server hat?Kann man das irgendwie mit nen Plugin oder so testen? habe nicht so Ahnung von Servern .
-
Sehr amüsant
Es wirkt richtig so, als ob die Kühe schlittschuh fahren und dann im Futter kuscheln? Als ob es so eine Box für sie wäre xD
Ich sage mal so, es ist quasi unmöglich (zumindest in 0.3.7) sowas vernünftig umzusetzen.
Aber sieht gut aus, wieso nicht
Ja das mit den Boxen könnte man noch besser berechnen das sie, dort dann auch besser stehen
Aber das mit den schlitschuh fahren, liegt nun mal an Samp da fällt mir quasi keine Möglichkeit ein außer Mods