[Ajuda] Estrutura de dados
#1

Eai pessoal, tou com uma pequena duvida em relaзгo a estrutura de dados em pawn й eu creio que vocкs podem me ajudar. Entгo eu estou implementando no meu sistema de clг, outro sistema para que na base do clг para que os players possam acessar um menu de items que sera colocado pelos propios membros do grupo.

Eu cheguei em uma parte em que a a estrutura de dados й crucial.

indo direto ao ponto eu queria fazer isso (irei explicar no final):

Codigo em C puro:

Код HTML:
typedef struct elementos{
	int nome_item[24];
	int quantidade_item;
}tipo_elemento;

typedef struct listaBases{
	int id_base;
	float base_pos_x;
	float base_pos_y;
	float base_pos_z;
	tipo_elemento items[65];
}tipo_base;
No codigo em C puro como vocкs ja devem saber esse seria a forma de criar estrutura do tipo "tipo_base" que dentro dela contйm um vetor do tipo elemento que seria os items e as quantidades dele, ou seja para cada "base" teria um vetor para ate 65 items. e para preencher seria apenas:

Quote:

main..
tipo_base bases[MAX_BASES];
scanf("%s",&bases[0].items[0].nome_item);
scanf("%d",&bases[0].items[0].quantidade_item);

entгo seria algo como uma lista sequencial.

Й no caso de pawn? como seria essa estrutura eu nao achei nada relacionado a struct, apenas enum e essas coisas, teria alguma forma de eu fazer isso sem gambiarra?

Bem, eu estou pensando em fazer algo tipo isso mas seria uma baita de uma gambiarra:

Код HTML:
enum info_base{
	base_id,
	Float:base_x,
	Float:base_y,
	Float:base_z
}
new lista_base[MAX_BASES][info_base];

enum items_base{
	nomeItem[24],
	quantidade
}
new lista_items_base[MAX_BASES][65][items_base];
Entгo na hora de preencher os items eu faria algo como

strcpy(lista_items_base[ Player[playerid][pClan] ][j][nomeItem], ItemName, MAX_ITEM_NAME);

mas ai seriam estruturas independentes, me entendem? eu queria que fossem apenas uma!

Tambem poderia ser feito
Quote:

enum info_base{
base_id,
Float:base_x,
Float:base_y,
Float:base_z,
NomeItem[65][MAX_ITEM_NAME],
quantidade_Item[65]
}

Porem talves tambem nao seja a soluзao mais adequada.

Caso vocкs estejam conseguindo me entender me falem que tentarei explicar melhor.
Reply
#2

Vejб se й algo como isso, creio que sim... enfim.
Se vocк possuн algum conhecimento vai conseguir entender e reproduzir de forma melhor, sу estou dando uma 'base' pra vocк aprender.
PHP код:
#define MAX_BASES         10
#define MAX_IBASE         5
enum Itens_Data{
    
b_id,
    
b_nome[24],
    
b_quantia,
    
Float:b_pos[3],
};
new 
Itens_B[MAX_IBASE][Itens_Data] = {
    {
0"N/A"0, {0.0,0.0,0.0}},
    {
1"Capacete"1, {0.0,0.0,0.0}},
    {
2"Balas"1, {0.0,0.0,0.0}},
    {
3"Fuzil"1, {0.0,0.0,0.0}},
    {
4"Bazuca"1, {0.0,0.0,0.0}}
};
enum Base_Data{
    
bi_id,
    
bi_quantia,
};
new 
BaseItens[MAX_BASES][MAX_IBASE][Base_Data];
CMD:ditem(playeridparams[]){
    new 
baseiditemiditemquantia;
    if(
sscanf(params"ddd"baseiditemiditemquantia)) return SendClientMessage(playerid, -1"[!] /ditem [item id] [item quantia]");
    if(
itemid MAX_IBASE) return SendClientMessage(playerid, -1"[!] Item invalido.");
    if(
baseid MAX_BASES) return SendClientMessage(playerid, -1"[!] Base invalida.");
    if(!
BaseFreeSlotItem(baseid)) return SendClientMessage(playerid, -1"[!] Slots dessa base estб totalmente cheio.");
    
SetBaseItem(baseiditemiditemquantia);
    return 
1;
}
SetBaseItem(baseiditemiditemquantia){
    for(new 
0MAX_IBASEx++){
        if(
BaseItens[baseid][x][bi_id] == && itemquantia || itemquantia Itens_B[x][b_quantia]){
            
BaseItens[baseid][x][bi_id] = itemid;
            
BaseItens[baseid][x][bi_quantia] = itemquantia;
            break;
        }
    }
    return 
1;
}
BaseFreeSlotItem(baseid){
    for(new 
0MAX_IBASEx++)
        if(
BaseItens[baseid][x][bi_id] == 0) return true;
    return 
false;
}
CMD:base(playeridparams[]){
    new 
string[256], string2[256], baseid;
    if(
sscanf(params"d"baseid)) return SendClientMessage(playerid, -1"[!] base [base id].");
    if(
baseid MAX_BASES) return SendClientMessage(playerid, -1"[!] Base invalida.");
    
strcat(string"slot\tnome\tquantidade");
    for(new 
0MAX_IBASEi++){
        
format(stringsizeof(string), "%s\n%d\t%s\t%d\n"string iItens_B[BaseItens[baseid][i][bi_id]][b_nome], BaseItens[baseid][i][bi_quantia]);
        
ShowPlayerDialog(playerid3333DIALOG_STYLE_TABLIST_HEADERS"Itens Base"string"Fechar""");
    }
    return 
1;

Reply
#3

Quote:
Originally Posted by Felipealves
Посмотреть сообщение
Vejб se й algo como isso, creio que sim... enfim.
Se vocк possuн algum conhecimento vai conseguir entender e reproduzir de forma melhor, sу estou dando uma 'base' pra vocк aprender.
PHP код:
#define MAX_BASES         10
#define MAX_IBASE         5
enum Itens_Data{
    
b_id,
    
b_nome[24],
    
b_quantia,
    
Float:b_pos[3],
};
new 
Itens_B[MAX_IBASE][Itens_Data] = {
    {
0"N/A"0, {0.0,0.0,0.0}},
    {
1"Capacete"1, {0.0,0.0,0.0}},
    {
2"Balas"1, {0.0,0.0,0.0}},
    {
3"Fuzil"1, {0.0,0.0,0.0}},
    {
4"Bazuca"1, {0.0,0.0,0.0}}
};
enum Base_Data{
    
bi_id,
    
bi_quantia,
};
new 
BaseItens[MAX_BASES][MAX_IBASE][Base_Data];
CMD:ditem(playeridparams[]){
    new 
baseiditemiditemquantia;
    if(
sscanf(params"ddd"baseiditemiditemquantia)) return SendClientMessage(playerid, -1"[!] /ditem [item id] [item quantia]");
    if(
itemid MAX_IBASE) return SendClientMessage(playerid, -1"[!] Item invalido.");
    if(
baseid MAX_BASES) return SendClientMessage(playerid, -1"[!] Base invalida.");
    if(!
BaseFreeSlotItem(baseid)) return SendClientMessage(playerid, -1"[!] Slots dessa base estб totalmente cheio.");
    
SetBaseItem(baseiditemiditemquantia);
    return 
1;
}
SetBaseItem(baseiditemiditemquantia){
    for(new 
0MAX_IBASEx++){
        if(
BaseItens[baseid][x][bi_id] == && itemquantia || itemquantia Itens_B[x][b_quantia]){
            
BaseItens[baseid][x][bi_id] = itemid;
            
BaseItens[baseid][x][bi_quantia] = itemquantia;
            break;
        }
    }
    return 
1;
}
BaseFreeSlotItem(baseid){
    for(new 
0MAX_IBASEx++)
        if(
BaseItens[baseid][x][bi_id] == 0) return true;
    return 
false;
}
CMD:base(playeridparams[]){
    new 
string[256], string2[256], baseid;
    if(
sscanf(params"d"baseid)) return SendClientMessage(playerid, -1"[!] base [base id].");
    if(
baseid MAX_BASES) return SendClientMessage(playerid, -1"[!] Base invalida.");
    
strcat(string"slot\tnome\tquantidade");
    for(new 
0MAX_IBASEi++){
        
format(stringsizeof(string), "%s\n%d\t%s\t%d\n"string iItens_B[BaseItens[baseid][i][bi_id]][b_nome], BaseItens[baseid][i][bi_quantia]);
        
ShowPlayerDialog(playerid3333DIALOG_STYLE_TABLIST_HEADERS"Itens Base"string"Fechar""");
    }
    return 
1;

Entendi, provavelmente irei usar dessa forma mesm.
Obrigado.

Entao tirando minha duvida, em pawn nao й possivel criar variaveis de outros tipos diretamente, sem ser os primitivos?
Reply
#4

Nгo, pawn й mt limitado, mas talvez exista plugins, ai jб nгo sei.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)