07/12/2023 12:37
(Esta mensagem foi modificada pela última vez a: 07/12/2023 12:52 por Carlos Victor.)
Eu fiquei analisando seu sistema e não compreendi a matriz no enumerador Loots, esse sistema de loot seria como se fosse um corpo do jogador caído no chão?
Quando eu digo em relação a otimização de código, eu falo sobre isso:
Percebe que criei algumas funções para me ajudar a manipular os drops no server? Evitando ficar criando loops atoa sem necessidade... O código não sei se é funcional, não testei e fiz aqui agora, mas pega de exemplo, pode usar como base e fazer o seu sistema, só queria deixar um exemplo de como ficaria melhor e menos confuso o código. Você pode criar uma função para retornar o modelo das armas e verificar se o item que está sendo dropado for arma, e se sim remove a arma do jogador, tem uma função chamada RemovePlayerWeaponID no tópico de códigos úteis, eu que mandei lá, pega esse código e usa ao seu favor. Qualquer dúvida só enviar aqui.
Quando eu digo em relação a otimização de código, eu falo sobre isso:
Percebe que criei algumas funções para me ajudar a manipular os drops no server? Evitando ficar criando loops atoa sem necessidade... O código não sei se é funcional, não testei e fiz aqui agora, mas pega de exemplo, pode usar como base e fazer o seu sistema, só queria deixar um exemplo de como ficaria melhor e menos confuso o código. Você pode criar uma função para retornar o modelo das armas e verificar se o item que está sendo dropado for arma, e se sim remove a arma do jogador, tem uma função chamada RemovePlayerWeaponID no tópico de códigos úteis, eu que mandei lá, pega esse código e usa ao seu favor. Qualquer dúvida só enviar aqui.
Código PHP:
#define MAX_DROPS (1000)
#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
enum droppedData
{
bool:droppedExists,
droppedModel,
droppedAmount,
Float:droppedPos[3],
droppedInterior,
droppedVirtualWorld,
droppedObject,
Text3D:droppedText
};
new DroppedItems[MAX_DROPS][droppedData];
Drop_Item(playerid, itemid, amount)
{
new
id = Drop_FreeID();
if(id == -1)
return SendClientMessage(playerid, -1, "* O limite de itens dropados foi atingido.");
DroppedItems[id][droppedExists] = true;
DroppedItems[id][droppedModel] = itemid;
DroppedItems[id][droppedAmount] = amount;
GetPlayerPos(playerid, DroppedItems[id][droppedPos][0], DroppedItems[id][droppedPos][1], DroppedItems[id][droppedPos][2]);
DroppedItems[id][droppedInterior] = GetPlayerInterior(playerid);
DroppedItems[id][droppedVirtualWorld] = GetPlayerVirtualWorld(playerid);
Drop_Refresh(id);
return id;
}
Drop_Refresh(id)
{
if((id < 0 || id > MAX_DROPS) || !DroppedItems[id][droppedExists])
return 0;
if(IsValidDynamicObject(DroppedItems[id][droppedObject]))
DestroyDynamicObject(DroppedItems[id][droppedObject]);
if(IsValidDynamic3DTextLabel(DroppedItems[id][droppedText]))
DestroyDynamic3DTextLabel(DroppedItems[id][droppedText]);
DroppedItems[id][droppedObject] = CreateDynamicObject(DroppedItems[id][droppedModel], DroppedItems[id][droppedPos][0], DroppedItems[id][droppedPos][1], DroppedItems[id][droppedPos][2], 0.0, 0.0, 0.0, DroppedItems[id][droppedVirtualWorld], DroppedItems[id][droppedInterior]);
DroppedItems[id][droppedText] = CreateDynamic3DTextLabel("(( Pressione 'F' para coletar o item. ))", 0xFFFFFFFF, DroppedItems[id][droppedPos][0], DroppedItems[id][droppedPos][1], DroppedItems[id][droppedPos][2], 5.0);
return 1;
}
Drop_FreeID()
{
for(new i; i < MAX_DROPS; i++) {
if(!DroppedItems[i][droppedExists])
return i;
}
return -1;
}
Drop_Nearest(playerid)
{
for(new i; i < MAX_DROPS; i++) if(DroppedItems[i][droppedExists])
{
if(IsPlayerInRangeOfPoint(playerid, 2.5, DroppedItems[i][droppedPos][0], DroppedItems[i][droppedPos][1], DroppedItems[i][droppedPos][2]) && GetPlayerVirtualWorld(playerid) == DroppedItems[i][droppedVirtualWorld] && GetPlayerInterior(playerid) == DroppedItems[i][droppedInterior])
return i;
}
return -1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
static
id;
if(PRESSED(KEY_SECONDARY_ATTACK))
{
if((id = Drop_Nearest(playerid)) != -1)
{
// Coletar o item com o índice 'id'.
}
}
return 1;
}