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:
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.
#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;
}
Alles anzeigen
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