Tio Akima

Membro
  • Total de itens

    66
  • Registro em

  • Última visita

  • Days Won

    6

Reputação

20 Contribuidor

6 Seguidores

Sobre Tio Akima

M?todos de Contato

  • Website URL
    http://tioakima.deviantart.com/

Informa??o do Perfil

  • Sexo:

Últimos Visitantes

2.030 visualizações
  1. Seu emulador é o brA ? Ta faltando remover em algum arquivo, porq se não remover de todos, ela vai continuar aparecendo no seu Alt S Não tem nenhum arquivo no banco de dados que também precisa remover? @EDIT Alias, na pasta data tem 2 caminhos bem semelhantes... Da uma olhada - luafiles514\lua files\skillinfoz - luafiles514\lua files\skillinfo
  2. Faz o seguinte: Em battle.c, na função: int battle_check_target( struct block_list *src, struct block_list *target,int flag) No inicio (cabeçalho da função) coloque isto: struct map_session_data *sd = NULL; //condição para acertar um mob apenas se estiver usando determinado item int hand1,hand2 = 0; //condição para acertar um mob apenas se estiver usando determinado item int item_id = 1201; //knife //condição para acertar um mob apenas se estiver usando determinado item int mob_id = 1002; //poring //condição para acertar um mob apenas se estiver usando determinado item Agora, abaixo do primeiro IF(), você coloca essa condição: if(src->type==BL_PC){ sd = BL_UCCAST(BL_PC,src); hand1 = sd->status.inventory[sd->equip_index[EQI_HAND_L]].nameid; hand2 = sd->status.inventory[sd->equip_index[EQI_HAND_R]].nameid; } Agora procure por estas linhas que setam condições da pedra do Emperium: if (map_flag_gvg(m) && !sd->status.guild_id && t_bl->type == BL_MOB && BL_UCCAST(BL_MOB, t_bl)->class_ == MOBID_EMPELIUM) return 0; //If you don't belong to a guild, can't target emperium. if( t_bl->type != BL_PC ) state |= BCT_ENEMY; //Natural enemy. break; E logo acima, coloque a essa condição: if(BL_UCCAST(BL_MOB, t_bl)->class_ == mob_id && (hand1 != item_id || hand2 != item_id)) return 0; Oque vai acontecer ai é o seguinte, você configura la em cima o ID do equipamento que você quer.. configura o ID do mob que vc quer atacar.. Se você estiver sem esse equipamento, você não consegue atacar o MOB. Se tiver com o equipamento, você ataca normalmente. É isso.. Só compilar e ser Feliz. Thanks/collaboration: @Vor pela ajuda e por compartilhar seu conhecimento. @Easycore (from Herc. community) pela contribuição.
  3. Tenta alterar no arquivo msgstringtable.txt Esse arquivo fica na sua pasta data. No meu funciona perfeitamente. tenta essa alternativa, talvez resolva.
  4. Estou lendo sobre alguns comandos ai Unit->walk, entre outros.. acredito que o caminho é por ai mesmo... Estou fazendo uma skill que sumona um mob correndo numa direção (na direção que o player estiver virado ) e quando o mob encontrar uma célula nao andável (ou ocupada) o mob desaparece. @EDIT: Encontrei essa skill case NPC_RUN: { const int mask[8][2] = {{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1}}; uint8 dir = (bl == src)?unit->getdir(src):map->calc_dir(src,bl->x,bl->y); //If cast on self, run forward, else run away. unit->stop_attack(src); //Run skillv tiles overriding the can-move check. if (unit->walktoxy(src, src->x + skill_lv * mask[dir][0], src->y + skill_lv * mask[dir][1], 2) && md) md->state.skillstate = MSS_WALK; //Otherwise it isn't updated in the AI. } break; Vou tentar editar e usar algo...
  5. Olá pessoal, alguém sabe se te alguma função na SRC para manipular um mob? (faze-lo andar nas direções que vc quer) Estive olhando em mob.c e vi que tem o comando mob->randomwalk() faz o mob andar, mas para direções randômicas... Se acaso não tiver nenhum comando especifico, vou ter que adaptar esse.
  6. Desculpe HD, erro meu Troca o comando "script_reload(nd);" pelo npc->reload(nd);
  7. HD tem algumas coisas que está estranho... algo errado nao está certo, rs como por exemplo a declaração em cima, tenta por ACMD aqui ó, testa esse daqui ACMD(npc) { char npcname[NAME_LENGTH+1]; struct npc_data *nd; memset(npcname, '\0', sizeof(npcname)); // armazenar oque o plyer digitou na variavel "npcname" if (!*message || sscanf(message, "%23[^\n]", npcname) < 1) { clif->message(fd, msg_fd(fd,1129)); // Please enter a NPC name (usage: @npc <NPC_name>). return false; } nd = npc->name2id(npcname); //Seleciona o script a ser executado (nome do script deve ser igual ao conteudo do parâmetro) if (nd){ npc->reload(nd); clif->message(fd, msg_fd(fd,100)); // Scripts carregado } else { clif->message(fd, msg_fd(fd,111)); // Este NPC não existe return false; } return true; } compilei aqui e rodou! veja se da ok ai @EDIT tenta agora @HD Scripts
  8. Acho que entendi hahah pelo rumo que tava tomando o post, achei que você queria só exibir mensagens na tela (ou no console) Bom, você pode tentar fazer o seguinte (seguindo a lógica do que você quer) ACMD_FUNC(npc) { struct npc_data* nd; nullpo_retr(-1, sd); char nome_script; memset(nome_script, '\0', sizeof(nome_script)); // armazenar oque o plyer digitou na variavel "nome_script" nd = npc->name2id("nome_script"); //Seleciona o script a ser executado (nome do script deve ser igual ao conteudo do parâmetro) if (nd){ script->run(nd->u.scr.script, 0, sd->bl.id, nd->bl.id); //Executa o Script } else { char output[128]; sprintf(output, "Não foi possível realizar esta ação!"); clif->messagecolor_self(sd->fd, COLOR_RED, output); } } break; Você pode trocar o script->run() por script->reload(nd) Acredito que a lógica é por ai @EDIT - melhorou, acho.
  9. Olá Você está fazendo esse código na src? em qual arquivo exatamente/ skill.c ? Se você quer printar essa mensagem no console (saída no mapserver) vc pode usar printf("Mensagem no console do emulador"); Se quer printar a mensagem dentro do game, no chat, você pode usar: char output[128]; sprintf(output, "Sua mensagem aqui na cor vernmelha!"); clif->messagecolor_self(sd->fd, COLOR_RED, output);
  10. Tem alguns passos a serem feitos. Será preciso criar uma DB custom, semelhante a de criar flechas. Dei mais uma olhada e vai dar um pouco de trampo viu manu... tipo,,, um bom trampo, mas vamos la.. (PS: Não testei nada, estou me baseando no pouco que eu sei, então... pode ser que não dê certo,) (PS2: Sempre faça um beckup antes de modificar a SRC) Em skill.h declare seu #DEFINE custom procure as linhas #define MAX_SKILL_ARROW_DB 140 #define MAX_ARROW_RESOURCE 5 e adicione #define MAX_SKILL_CUSTOM_DB 140 #define MAX_CUSTOM_RESOURCE 5 Depois procure por struct s_skill_arrow_db arrow_db[MAX_SKILL_ARROW_DB]; e adicione struct s_skill_custom_db custom_db[MAX_SKILL_CUSTOM_DB]; Em skill.c, procure essa linha: skill->parse_row_createarrowdb = skill_parse_row_createarrowdb; Logo abaixo coloque a sua declaração customizada (vamos utiliza-la ali na frente) exemplo: skill->parse_row_createacustomdb = skill_parse_row_createacustomdb; *(veja que eu declarei "create custom db", mas vc pode declarar o nome que vc quiser, é só um exemplo.. mas lembre-se que usará essa declaração ) depois que fez isso, ainda em skill.c procure esse código: bool skill_parse_row_createarrowdb(char* split[], int columns, int current) { // SourceID,MakeID1,MakeAmount1,...,MakeID5,MakeAmount5 int x,y; int i; nullpo_retr(false, split); i = atoi(split[0]); if( !i ) return false; skill->dbs->arrow_db[current].nameid = i; for( x = 1, y = 0; x+1 < columns && split[x] && split[x+1] && y < MAX_ARROW_RESOURCE; x += 2, y++ ) { skill->dbs->arrow_db[current].cre_id[y] = atoi(split[x]); skill->dbs->arrow_db[current].cre_amount[y] = atoi(split[x+1]); } return true; } Reproduza essa função. agora altere o nome usando o mesmo da declaração custom que vc fez, TAMBEM ALTERE O DEFINE para o que vc criou aqui no caso ficaria assim> bool skill_parse_row_createacustomdb(char* split[], int columns, int current) { // SourceID,MakeID1,MakeAmount1,...,MakeID5,MakeAmount5 int x,y; int i; nullpo_retr(false, split); i = atoi(split[0]); if( !i ) return false; skill->dbs->arrow_db[current].nameid = i; for( x = 1, y = 0; x+1 < columns && split[x] && split[x+1] && y < MAX_CUSTOM_RESOURCE; x += 2, y++ ) { skill->dbs->arrow_db[current].cre_id[y] = atoi(split[x]); skill->dbs->arrow_db[current].cre_amount[y] = atoi(split[x+1]); } return true; } continuando em skill.c procure essa linha: (Isso no emulador Herc. veja que ele seta o caminho direto, colocando o nome do arquivo da db em txt : "create_arrow_db.txt") sv->readdb(map->db_path, "create_arrow_db.txt", ',', 1+2, 1+2*MAX_ARROW_RESOURCE, MAX_SKILL_ARROW_DB, skill->parse_row_createarrowdb); Agora, ja no brAthena se não me engano é diferente porque usa SQL, então no brA vai estar assim: sv_readsqldb(get_database_name(7), 1+2*MAX_ARROW_RESOURCE, -1, skill->parse_row_createarrowdb); Esse "get_database_name(7) retorna o nome da db, ou seja, ele retorna um string... Então, você copia esse código e o reproduza-o logo abaixo alterando o endereço da db. Eu nao sei aonde ele está indo buscar o nome da db, não parei pra ver, mas o pessoal do DESENV com certeza sabe. Bom, acredito que se você substituir pelo nome da db direto, acho (nao tenho certeza) acho que não vai ter problemas... E NÃO ESQUEÇA TAMBEM DE SUBSTITUIR O #DEFINE E TAMBEM o "skill->parse_row_createarrowdb" no final da linha, pela sua declaração que fez lá em cima> É preciso usa-la aqui novamente. ficaria assim: sv_readsqldb("nome_db_custom", 1+2*MAX_CUSTOM_RESOURCE, -1, skill->parse_row_createcustomdb); aaaaaainda em skill.c é preciso reproduzir outra função procure pela declaração dela: skill->arrow_create = skill_arrow_create; e adicione a sua custom (lembre-se dela, você usará essa função no arquivo CLIF.C) exemplo: skill->custom_create = skill_custom_create; Agora que fez a declaração, procure o código da função propriamente dita procure por int skill_arrow_create (struct map_session_data *sd, int nameid) { int i,j,flag,index=-1; struct item tmp_item; nullpo_ret(sd); if(nameid <= 0) return 1; for(i=0;i<MAX_SKILL_ARROW_DB;i++) if(nameid == skill->dbs->arrow_db[i].nameid) { index = i; break; } if(index < 0 || (j = pc->search_inventory(sd,nameid)) == INDEX_NOT_FOUND) return 1; pc->delitem(sd, j, 1, 0, DELITEM_NORMAL, LOG_TYPE_PRODUCE); // FIXME: is this the correct reason flag? for(i=0;i<MAX_ARROW_RESOURCE;i++) { memset(&tmp_item,0,sizeof(tmp_item)); tmp_item.identify = 1; tmp_item.nameid = skill->dbs->arrow_db[index].cre_id[i]; tmp_item.amount = skill->dbs->arrow_db[index].cre_amount[i]; if(battle_config.produce_item_name_input&0x4) { tmp_item.card[0]=CARD0_CREATE; tmp_item.card[1]=0; tmp_item.card[2]=GetWord(sd->status.char_id,0); // CharId tmp_item.card[3]=GetWord(sd->status.char_id,1); } if(tmp_item.nameid <= 0 || tmp_item.amount <= 0) continue; if((flag = pc->additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_PRODUCE))) { clif->additem(sd,0,0,flag); map->addflooritem(&sd->bl, &tmp_item, tmp_item.amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } return 0; } reproduza a função e edite ela -mude o nome para a sua custom criada no passo anterior -mude o #DEFINE para o seu custom no caso ficaria assim> int skill_custom_create (struct map_session_data *sd, int nameid) { int i,j,flag,index=-1; struct item tmp_item; nullpo_ret(sd); if(nameid <= 0) return 1; for(i=0;i<MAX_SKILL_CUSTOM_DB;i++) if(nameid == skill->dbs->arrow_db[i].nameid) { index = i; break; } if(index < 0 || (j = pc->search_inventory(sd,nameid)) == INDEX_NOT_FOUND) return 1; pc->delitem(sd, j, 1, 0, DELITEM_NORMAL, LOG_TYPE_PRODUCE); // FIXME: is this the correct reason flag? for(i=0;i<MAX_CUSTOM_RESOURCE;i++) { memset(&tmp_item,0,sizeof(tmp_item)); tmp_item.identify = 1; tmp_item.nameid = skill->dbs->arrow_db[index].cre_id[i]; tmp_item.amount = skill->dbs->arrow_db[index].cre_amount[i]; if(battle_config.produce_item_name_input&0x4) { tmp_item.card[0]=CARD0_CREATE; tmp_item.card[1]=0; tmp_item.card[2]=GetWord(sd->status.char_id,0); // CharId tmp_item.card[3]=GetWord(sd->status.char_id,1); } if(tmp_item.nameid <= 0 || tmp_item.amount <= 0) continue; if((flag = pc->additem(sd,&tmp_item,tmp_item.amount,LOG_TYPE_PRODUCE))) { clif->additem(sd,0,0,flag); map->addflooritem(&sd->bl, &tmp_item, tmp_item.amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 0); } } return 0; } Agora, vamos criar outra lista em clif.c procure clif->arrow_create_list = clif_arrow_create_list; adicione (esse nome é um exemplo, faça como quiser, VOCÊ IRÁ UTILIZA-LO NO PASSO SEGUINTE) clif->custom_create_list = clif_custom_create_list; Agora procure o código dessa função e reproduza-o void clif_arrow_create_list(struct map_session_data *sd) { int i, c; int fd; nullpo_retv(sd); fd = sd->fd; WFIFOHEAD(fd, MAX_SKILL_ARROW_DB*2+4); WFIFOW(fd,0) = 0x1ad; for (i = 0, c = 0; i < MAX_SKILL_ARROW_DB; i++) { int j; if (skill->dbs->arrow_db[i].nameid > 0 && (j = pc->search_inventory(sd, skill->dbs->arrow_db[i].nameid)) != INDEX_NOT_FOUND && !sd->status.inventory[j].equip && sd->status.inventory[j].identify ) { if ((j = itemdb_viewid(skill->dbs->arrow_db[i].nameid)) > 0) WFIFOW(fd,c*2+4) = j; else WFIFOW(fd,c*2+4) = skill->dbs->arrow_db[i].nameid; c++; } } WFIFOW(fd,2) = c*2+4; WFIFOSET(fd, WFIFOW(fd,2)); if (c > 0) { sd->menuskill_id = AC_MAKINGARROW; sd->menuskill_val = c; } } Após reproduzi-lo, altere oque precisa ser alterado, como por exemplo o nome (deve ter o nome da declaração que você fez acima) também deve alterar o #DEFINE E tambem o nome da skill logo no final do código, mude para o nome da sua skill custom. no caso ficaria assim> void clif_custom_create_list(struct map_session_data *sd) { int i, c; int fd; nullpo_retv(sd); fd = sd->fd; WFIFOHEAD(fd, MAX_SKILL_CUSTOM_DB*2+4); WFIFOW(fd,0) = 0x1ad; for (i = 0, c = 0; i < MAX_SKILL_CUSTOM_DB; i++) { int j; if (skill->dbs->arrow_db[i].nameid > 0 && (j = pc->search_inventory(sd, skill->dbs->arrow_db[i].nameid)) != INDEX_NOT_FOUND && !sd->status.inventory[j].equip && sd->status.inventory[j].identify ) { if ((j = itemdb_viewid(skill->dbs->arrow_db[i].nameid)) > 0) WFIFOW(fd,c*2+4) = j; else WFIFOW(fd,c*2+4) = skill->dbs->arrow_db[i].nameid; c++; } } WFIFOW(fd,2) = c*2+4; WFIFOSET(fd, WFIFOW(fd,2)); if (c > 0) { sd->menuskill_id = NOMESKILL_CUSTOM_AQUI; sd->menuskill_val = c; } } Ainda em clif.c procure por case AC_MAKINGARROW: skill->arrow_create(sd,RFIFOW(fd,2)); break; reproduza essa parte colocando o nome da sua skill custom A função dentro também, coloque a custom que você fez la em skill,c no caso ficaria assim> case NOMESKILL_CUSTOM_AQUI: skill->custom_create(sd,RFIFOW(fd,2)); break; Uffa... Bom, está criado o caminho para a sua db custom Agora você precisa reproduzir a skill Fabricar Flechas(AC_MAKINGARROW). E utilizar este caminho Em skill.c reproduza esse codigo você vai utilizar o caminho custom aqui case AC_MAKINGARROW: if(sd) { clif->arrow_create_list(sd); clif->skill_nodamage(src,bl,skill_id,skill_lv,1); } break; mude o nome para sua skill custom mude o clif->arrow_create_list para o customizado que você criou clif->custom_create_list ainda em skill.c procure os outros dois lugares onde está declarado a skill case AC_MAKINGARROW: e coloque o nome da sua skill custom logo em cima (ou abaixo, tanto faz). Bom acho que é isso... Eu não testei, então nao sei se vai dar certo, mas a lógica é por ai... Sem contar que, to morrendo de sono, então talvez eu tenha deixado algo passar,,, se tiver alguma duvida, só chamar, tmais. att, tio Akima
  11. Pois é, ja estou vendo outras possibilidades, talvez fazer algo com script, mas obrigado pela reposta.
  12. Olá, estou precisando de uma ajuda alguem pode me ajudar com um scrip pra sumonar um mob ao usar uma skill? vc usa uma determinada skill, sumona um mob por alguns segundos, e depois de alguns segundos esse mob some. o mob pode aparecer na mesma coordenada do player olhando pra mesma direção se for possivel
  13. Oi pesspal Depois de criar uma espada custom, como posso associar esta espada custom com esses efeitos de ataque? Tem vários sprites de ataque de espadas, queria escolher um e colocar na minha espada custom. Segunda dúvida: No SRC, onde eu encontro o código que chama estes sprites? Estes sprites ocorrem quando você usa ataque básico, certo? Em que parte do src eu acho isso? A ideia é a seguinte, se for possivel, chamar este "efeito" (sprite) que aparece no ataque basico, em uma skill.. Possivel? alguem tem alguma luz? tmj att, tioakima
  14. Acabei de postar os aquivos que você deve alterar na pasta effec/ Só baixar, substituir e ser feliz. Abraços.
  15. Visulizar Arquivo AZURA - Aura off Oi pessoal, Estou postando os arquivos aqui para quem tem interesse em desabilitar aquela aura que aparece durante a habilidade AZURA. Havia postado a muito tempo, mas o link está quebrado e o pessoal que tem duvidas não tem mais acesso, então está aí novamente... Pra quem quiser, é só baixar e substituis os arquivos na pasta texture/effect/ E pronto! postei e sai correndo SHAUHSUAHSUAshauhsauHSUAHSUA att, tio akima Autor Tio Akima Enviado 29-07-2017 Categoria Efeitos