Pretendo fazer algo semelhante à arma gravitacional enquanto segura um objeto a 10,0 de distância da frente do jogador, mas não sei qual função usar para que quando o jogador olhar para cima este objeto flutuando seguindo a posição para onde o jogador está olhando
Que função faria isso por mim? Obtenha a posição para onde o jogador está olhando
Bom eu abro o servidor e entro nele e fico mexendo normal, ai depois de um tempo ele fechar sozinho oque poderá ser esse problema, já revisei todo o meu código para ver se algo não estava de errado, mais não encontrei nada. Alguém poderia mim ajuda por favor?
Bom galera eu estou usando o plugin CrashDetect no servidor e quando eu abror o samp.server.exe aparece isso
Código:
[debug] Run time error 4: "Array index out of bounds"
[debug] Attempted to read/write array element at negative index -1
[debug] AMX backtrace:
[debug] #0 0033ea9c in public Taxi () from GM.amx
a Callback
Código PHP:
public Taxi() { for(new I = 0; I < MAX_PLAYERS; I ++) { if(Taximetro[I][0] == 1) { if(GetPlayerMoneyEx(I) > PrecoCorrida[I] + 3) { new string[128]; PrecoCorrida[I] = PrecoCorrida[I] + 3; format(string, sizeof(string), "~ O taxímetro mostra: $%d", PrecoCorrida[I]); SendClientMessage(I, verde, string); SendClientMessage(Taximetro[I][1], verde, string); } if(GetPlayerMoneyEx(I) < PrecoCorrida[I] + 3) { SendClientMessage(I, COR_MARA2, "| INFO | Você não tem mais dinheiro para o taxi!"); SendClientMessage(Taximetro[I][1], COR_MARA2, "| INFO | Seu passageiro ficou sem dinheiro!"); GivePlayerMoneyEx(I, 0 - PrecoCorrida[I]); GivePlayerMoneyEx(Taximetro[I][1], PrecoCorrida[I]); RemovePlayerFromVehicle(I); PrecoCorrida[I] = 0; Taximetro[I][1] = 0; Taximetro[I][0] = 0; } } if(NoTelefone[I] != -1) { if(!PlayerToPoint(Radio, I, Coordenadas[GetHouseOwner(I)][0], Coordenadas[GetHouseOwner(I)][1], Coordenadas[GetHouseOwner(I)][2])) { SendClientMessage(I, COR_ORKUT, "| INFO | A chamada foi perdida porque você foi muito longe do ícone de sua casa!"); CmdDesligar(I); } } } return 1; }
case 0://MOCHILA GRANDE
{
if(GetPlayerMoney(playerid) < 3000) return SendClientMessage(playerid, 0xFF0000AA, "Voce nao possui dinheiro o suficiente para Compra!");
pItens[playerid][MochilaGrande] ++;
AddItem(playerid, 8, 1);
GivePlayerMoney(playerid, -3000);
SendClientMessage(playerid, 0x00FF00AA, "Parabens voce acaba de adquirir uma Mochila Oakley");
SendClientMessage(playerid, 0x00FF00AA, "Foi descontado R$3.000,00 de sua Carteira");
SalvarItens(playerid);
}
case 1:
{
if(GetPlayerMoney(playerid) < 1500) return SendClientMessage(playerid, 0xFF0000AA, "Voce nao possui dinheiro o suficiente para Compra!");
pItens[playerid][MochilaMedia] ++;
AddItem(playerid, 7, 1);
GivePlayerMoney(playerid, -1500);
SendClientMessage(playerid, 0x00FF00AA, "Parabens voce acaba de adquirir uma Mochila Oakley");
SendClientMessage(playerid, 0x00FF00AA, "Foi descontado R$1.500,00 de sua Carteira");
SalvarItens(playerid);
}
case 2:
{
if(GetPlayerMoney(playerid) < 500) return SendClientMessage(playerid, 0xFF0000AA, "Voce nao possui dinheiro o suficiente para Compra!");
pItens[playerid][Mochila] ++;
GivePlayerMoney(playerid, -500);
SendClientMessage(playerid, 0x00FF00AA, "Parabens voce acaba de adquirir uma Mochila Oakley");
SendClientMessage(playerid, 0x00FF00AA, "Foi descontado R$500,00 de sua Carteira");
SalvarItens(playerid);
}
case 3:
{
if(GetPlayerMoney(playerid) < 600) return SendClientMessage(playerid, 0xFF0000AA, "Voce nao possui dinheiro o suficiente para Compra!");
pItens[playerid][Capacete] ++;
GivePlayerMoney(playerid, -600);
AddItem(playerid, 1, 1);
SendClientMessage(playerid, 0x00FF00AA, "Parabens voce acaba de adquirir um Capacete LS2");
SendClientMessage(playerid, 0x00FF00AA, "Foi descontado R$600,00 de sua Carteira");
SalvarItens(playerid);
}
case 4:
{
if(GetPlayerMoney(playerid) < 500) return SendClientMessage(playerid, 0xFF0000AA, "Voce nao possui dinheiro o suficiente para Compra!");
pItens[playerid][KitMedico] ++;
GivePlayerMoney(playerid, -500);
AddItem(playerid, 18, 1);
SendClientMessage(playerid, 0x00FF00AA, "Parabens voce acaba de adquirir um Kit primeiro socorro");
SendClientMessage(playerid, 0x00FF00AA, "Foi descontado R$500,00 de sua Carteira");
SalvarItens(playerid);
}
case 5:
{
if(GetPlayerMoney(playerid) < 70) return SendClientMessage(playerid, 0xFF0000AA, "Voce nao possui dinheiro o suficiente para Compra!");
pItens[playerid][KitMedico] ++;
GivePlayerMoney(playerid, -70);
AddItem(playerid, 11, 1);
SendClientMessage(playerid, 0x00FF00AA, "Parabens voce acaba de adquirir uma Faca Tramontina");
SendClientMessage(playerid, 0x00FF00AA, "Foi descontado R$70,00 de sua Carteira");
SalvarItens(playerid);
}
ALGUEM ME AJUDA PF?
NÃO SEI QUE ERRO E ESSE NA HOST
Código:
[01/06/2021 10:16:37] Script[gamemodes/Gtt.amx]: Run time error 19: "File or function is not found"
[21:38:10] Error: Function not registered: 'SvCreateGStream'
[21:38:10] Error: Function not registered: 'SvGetVersion'
[21:38:10] Error: Function not registered: 'SvHasMicro'
[21:38:10] Error: Function not registered: 'SvCreateDLStreamAtPlayer'
[21:38:10] Error: Function not registered: 'SvAttachListenerToStream'
[21:38:10] Error: Function not registered: 'SvAddKey'
[21:38:10] Error: Function not registered: 'SvAttachSpeakerToStream'
[21:38:10] Error: Function not registered: 'SvDetachSpeakerFromStream'
[21:38:19] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:19] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:19] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:19] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:19] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:19] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:19] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:19] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:19] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:19] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:20] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:21] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:22] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Código:
[21:38:23] [sampgdk:error] Too many callback arguments (at most 32 allowed)
Bom galera hoje venho aqui mostra um pouco do meu projeto para vocês!
• Apresentação:
O Universo GTA é um servidor de SA:MP com GameMode no estilo RPG.
O servidorfoi inicialmente desenvolvido em 2011, no intuito de simular a Vida Real! Porem no decorrer da criação do mesmo, ocorreu alguns problemas pessoais e depois de um tempo voltei a programa. O servidor atualmente está na parte de desenvolvimento, mais já se encontra na reta final com diversas atualizações.
-Existe mais de93Profissõesem jogo, sendo elas dinâmicas com Outros Players, NPCs e também em solo.
• Sistema de Casas:
- Mais de 329 Casas Disponíveis sendo elas Mansões, Casas Populares, Barracos, Trailers e você poderá ter um Veículos casa(Sets), com diversos comandos únicos.
• Sistema de Empresas:
- Mais de 129 Empresas Disponíveis sendo elas Restaurantes,Bar,Utilitários,Loja de Roupas e entre outras. Com o ganho de lucros nas vendas de itens e mercadorias na empresa!
• Sistema de Necessidades:
- Se você estiver como Fome poderá se alimentar nos restaurantes e drivethru's espalhados pelo mapa. - Se você estiver como Sede poderá beber algo nos bares e restaurantes drivethru's espalhados pelo mapa. - Se você estiver como Sono poderá se descansa no quarto de hotel ou em uma casa. - Sistema exclusivo de DriveThru's pelo Mapa.
• Sistema de Ignição:
- Sistema exclusivo de motor e farois, com indicadores informativos.
• Sistema de Concessionaria:
- Na concessionaria você poderá possuir até 5 veículos, sendo eles Carros, Motos, Bikes e outros.
• Sistema de Radares/Pedagios:
- 9 Radares e 3 Pedagios espalhados pelo mapa e sistema de Sem-Para.
• Sistema de UPAr:
- Relógio UP exclusivo com sistema de troca de cor por comando.
• Sistema de VIP:
- VIP por vencimento de horário, com diversos comandos incluindo sistema de troca de cor do TAG VIP.
• E muito mais sistema que você só conferir jogando.
-Sobre os sistemas das profissões:
Sistema exclusivo de Plantação e colheita da profissão de Agricultor.
Sistema exclusivo de Rotas por CPS para Motorista de Ônibus.
Sistema exclusivo de Entrega de Jornais para a profissão Entregador de Jornal.
Sistema exclusivo de Cortar Arvores para Lenhadores.
Sistema de Coleta de Lixos para Garis.
Sistema exclusivo de coleta de Carcaças para Sucateiros.
Sistema exclusivo de coleta de Caixão para Agente Funerário.
• Existem muito mais sistemas de Profissões no servidor!
- Para mais Informações chame no Discord:LeleziiN#6392
»Procuro Sócio e Equipe competente para abrimos o Servidor.
- Criador/Desenvolvedor e Mapper do GameMode:LeleziiN
SendClientMessage(playerid, -1, "{FFD700}[VEICULO] Voce ligou seu veiculo com sucesso!");
}
else {
SendClientMessage(playerid, -1, "{FF4500}[ERRO] O seu veiculo ja esta ligado!");
}
} else SendClientMessage(playerid, -1, "{FF4500}[ERRO] Voce nao possui a chave desse veiculo");
pqp++;
break;
}
}
}
if(pqp == 0) SendClientMessage(playerid, -1, "{FF4500}[ERRO] Esse veiculo nao e da concessionaria e nao pode ser trancado!");
return 1;
}
mas o motor nao liga e retorna a msg O seu veiculo ja esta ligado!
Servidor com sistemas inovadores! Temos vagas para Helpers! Vagas para Líderes de orgs e corps! Eventos diários! Chuvas De PayDay ! Mansões, Empresas, Fazendas! Hqs Refeitas! Staff On!
Promoção Para novatos:
1 Veículo de Inv! Uma Casa Grátis! 40k De Cash! 1 Mês de sócio platina !
Olá. Gostaria de começar dizendo que esse tópico terá bastante teoria e é destinado a um público um pouco mais avançado. Bom, quando saímos um pouco dessa pequena região do SA-MP e adquirimos um pouco mais de experiência em outras linguagens, nós observamos em como ficamos limitados ao que realmente vimos aqui. Fora daqui, aprendemos conceitos extremamente fundamentais e importantes sobre arquitetura de sistemas além de ficarmos diante de inúmeras ferramentas, cenários e experiências e isso é muito bom para alguém que já está bem estabelecido aqui, abrindo novos horizontes para como escrevemos nossos códigos e como nos sentimentos em relação a eles. Meu objetivo aqui é, além de passar uma visão um pouco melhor de como devemos encarar as coisas, gerar também uma discussão bem filosófica de como as coisas deveriam ser e aprendermos mais trocando experiências.
BENCHMARKS
Bom, uma coisa que é levada muito a sério nessa comunidade são os benchmarks. Por algum motivo, a tendência aqui é usar sempre oq demonstra ser mais rápido em benchmarks, mesmo que isso abra mão de algumas boas vantagens, e aqui está um problema bem fundamental. Programação é um negócio que vimos com muita clareza que, quase nunca existe "o melhor", e sim, "o melhor para determinada coisa". E normalmente, oque costuma ser bom em algo, pode não ser muito bom para uma outra coisa e isso deve ser pensado.
Um exemplo bem claro é referente ao uso de PVars para guardar informações do jogador. PVars tem a característica de declarar "variáveis" que podem ser acessadas de uma forma externa (como um filterscript por exemplo) e isso é um recurso bem interessante se bem trabalhado. Observe muitos dos filterscripts atualmente; Nem todos conseguem funcionar de uma forma plug-in-play, visto que, eles não conseguem acessar informações (como de contas por exemplo) de dentro do seu gamemode e acaba sendo necessário sempre adaptá-los. De igual modo, você também terá limitações para construir filterscripts para seu próprio servidor.
PVars apesar de possuir esse recurso, ela acaba sendo um pouco menos performática do que uma variável declarada puramente com new/static. Porém, ela tem esse uso que pode trazer inúmeros benefícios abrindo mão de alguns poucos milésimos (que sinceramente, nem sempre fará falta). Normalmente é interessante utiliza-las em informações globalizadas como o dinheiro atual do jogador (Para fazer um GivePlayerMoneyEx em um Filterscript por exemplo) ou até ver se ele já fez login no servidor.
A moral da história aqui é, vale muito apena abrir mão de alguns milésimos de segundos afim de ganhar algo em troca (como consistência e/ou novos recursos). Não se prenda tanto aos números.
ORIENTAÇÃO A OBJETOS
Se você já experimentou algumas linguagens de programação, MUITO provavelmente você deve saber os benefícios da Orientação a Objetos. Se você ainda não experienciou isso, aconselho que pesquise um pouco, mas de forma BEM RESUMIDA e pra contextualizar, é uma forma de você isolar uma séria de métodos e atributos afim de descrever alguma entidade.
Bem, pawno não tem OO, mas isso não nos impede de pegar alguns conceitos e tentar fazer algo seguindo a mesma filosofia. Vou usar de exemplo o anti-hacker mais fácil de se construir que basicamente QUALQUER servidor tem. Me refiro ao anti-money hacker. Observe o Seguinte:
Não está completo o anti-money hacker, mas observe oq fizemos aqui. O SA-MP tem um erro de arquitetura bem inocente aqui. Basicamente a informação de dinheiro do jogador, é vinda do próprio jogador. Ou seja, se o jogador usar um cleo de dinheiro, quando essa informação for ao samp-server (via Raknet), o servidor irá guardar essa informação e confiar nela (MANO?). O que fazemos para resolver isso então? Bem, armazenamos a informação do dinheiro do player em uma variável e vamos passar a confiar no valor dela, e não no valor dado por GetPlayerMoney. E aqui está o ponto que quase ninguém se atenta.
Esse é um exemplo simples, então não costuma ser cometido o erro que vou demonstrar agora, mas serve pra contextualizar (visto que é o mesmo contexto). Nesse exemplo como pode ser observado, precisamos nos preocupar em garantir que o jogador, veja o dinheiro do seu personagem sendo o mesmo valor que Dinheiro[playerid], para isso usamos OnPlayerUpdate (ou um timer se preferir) para verificar se o dinheiro em mãos do jogador, é o mesmo que ele de fato deveria ter. Se não for, ele reseta e da a quantia correta.
Observe que de igual modo, também devemos nos preocupar de, quando atribuir o dinheiro ao jogador, alterar também o valor em Dinheiro[playerid]. Como fazemos isso de forma consistente e sem efeitos colaterais? Isolamos o comportamento e a informação em um método chamado GivePlayerMoneyEx. BINGOOO! Seguimos o mesmo principio aqui que aprendemos em OO de isolar o atributo em métodos getters e setters e nunca acessar diretamente o atributo, afim de manter consistência. Se não fizéssemos isso, teríamos de toda vez que usar GivePlayerMoney, também atribuir o novo valor de Dinheiro[playerid] e isso com o tempo MUITO provavelmente iria gerar um efeito colateral onde ambos os valores não estariam bem sincronizados e também dificultaria muito a manutenção. Imagine que você queira adicionar uma validação, como por exemplo, ver se ele está logado para poder dar a grana. Se não fizermos dessa forma, será HORRÍVEL ter de buscar toda vez que usamos GivePlayerMoney e adicionar essa validação sendo que usar uma função para isolar tudo isso. Teria poupado esse sofrimento.
Esse exemplo foi para contextualizar. Normalmente o pessoal isola as informações de forma correta no GivePlayerMoney, mas nem sempre fazem isso no restante do gamemode. Abra seu gamemode e observe quantas vezes usamos algo como:
Código:
if(Casa[playerid] == ALGUMA COISA) {
// bla bla bla
}
Casa[playerid] = casaid;
A moral da história aqui é, isole os atributos, por mais simples que seja e evite ao máximo altera-los de forma direta, e sim, através de um método (função).
DICA DE ESTRUTURA Uma coisa que foi muito bem recebida aqui, foi o conceito de modularização do gamemode. Claro que foi bem recebido! Isso melhora muito a manutenção e a integridade do gamemode. Agora tente juntar isso e o conceito que foi abordado aqui e vamos ter um resultado um pouco melhor. Normalmente juntamente da pasta "modules" eu costumo criar uma pasta chamada "entities" (elements e objetos são nomes legais também). Qual é o objetivo dela? Bem, nela eu procuro imaginar que cada arquivo ali será como uma classe. Por exemplo, o arquivo Player.inc será como class Player e lá dentro eu coloco os atributos do jogador, como por exemplo:
Código:
enum E_PLAYER_DATA {
E_PLAYER_NAME[24],
E_PLAYER_SKIN,
E_PLAYER_MONEY
}
new PLAYER_DATA[MAX_PLAYERS][E_PLAYER_DATA];
Aqui eu defini uma estrutura que compõe algumas das características do objeto Player. Em uma outra linguagem utilizando OO seria algo como:
Código:
class Player {
private string Name;
private int Skin;
private int Money;
private bool Auth;
}
Como pode ver no código acima, os atributos são privados, então apenas a classe Player tem visibilidade deles. Infelizmente não podemos fazer isso no pawno, então tenha o bom senso de não utilizar os atributos diretamente.
Certo, então como faço caso queira alterar uma informação do jogador? Simples, crie um método setter. No pawno, seria fazer algo como:
Código:
enum E_PLAYER_DATA {
E_PLAYER_NAME[24],
E_PLAYER_SKIN,
E_PLAYER_MONEY
}
new PLAYER_DATA[MAX_PLAYERS][E_PLAYER_DATA];
Em uma outra linguagem utilizando OO, seria algo como:
Código:
class Player {
private string Name;
private int Skin;
private int Money;
public void setSkin(int skin) {
this.Skin = skin;
}
}
Certo, agora lá na pasta "modules", onde ficam todos os sistemas do seu servidor como casas, empresas e etc. Sempre que você quiser alterar a skin do jogador, você irá utilizar Player_SetSkin que está isolada e possuí todos os atributos e validações necessárias.
Agora imagine o seguinte, você desenvolveu uma enorme parte do seu gamemode e precisa adicionar um atributo a função Player_SetSkin. Você quer por exemplo impedir que altere a skin de um jogador que não está autenticado (logado). Como os modulos do seu servidor utilizam a função Player_SetSkin e toda a logica está contida dentro dela, você só precisa ir até ela lá na pasta "entities/Player.inc" e adicionar a validação:
Com isso, é sempre garantido fácil manutenção e impede muitos efeitos colaterias.
CONSIDERAÇÕES
Acredito ter dito tudo oque precisa aqui e espero ter sido bem claro. Eu estou com um pouco de pressa no momento então irei corrigindo ou acrescentando coisas ao post com o decorrer do tempo. Espero com isso gerar uma atenção maior sobre arquitetura e gerar alguns melhores debates sobre isso. Boa noite senhores <3
Galera to com alguns sistema em texdraw funciona perfeitamente no pc porem no apk ele buga não seleciona não eo apk pq ja testei o apk em outro serve e funciono perfeitamente o mesmo sistema que o meu oque sera que ta ocasionando isso alguem me ajuda pf? Buga principalmente os mSelection tipo ele seleciona fica amarelo a parte selecionada mas nao execulta a função tipo que nao estivece clicando eo msm sistema em outro servido funciona corretamente exemplo a conce do vsrp eo msm sistema da minha no vsrp funciona e no meu nao