Entre para seguir isso  
Seguidores 0
Vermillion

Criando monstro não alvejável mediante variavel

9 posts neste tópico

Estou criando um monstro que não poderá ser atingido a não ser que uma certa variável seja 1 no personagem. O código que estou tentando usar é esse:

battle.c(7650)

Citar

if (pc_readglobalreg(sd,"PickOn") == 0 && t_bl->type == BL_MOB && BL_UCCAST(BL_MOB, t_bl)->class_ == MOBID_OREMINE1)
                return 0; //DAQUI PRA BAIXO É OFICIAL
            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;

Sendo MOBID_OREMINE1 o ID do monstro, e abaixo do primeiro 'return 0;' linhas oficiais do emulador. Não consigo mais atacar o monstro, mas porque ao ter varíavel "PickOn"==1 eu ainda não consigo atacá-lo? O que está errado aí? Existe como colocar itens equipados como condição também?

Editado por Vermillion
0

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não precisa setar uma variavel e guardar em sql para fazer isso. Uma coisa que dessa maneira vc teria que relogar o personagem para atualziar. tente assim:

 

em battle.c

add isso

			if ( !sd->state.atk_liberado && t_bl->type == BL_MOB && BL_UCCAST(BL_MOB, t_bl)->class_ == MOBID_PORING)
                return 0; //DAQUI PRA BAIXO É OFICIAL

antes disso

			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.

em pc.h 
add isso

unsigned int atk_liberado : 1;

depois disso

unsigned int protection_acc : 1; // Proteção de Conta - [Orce brAthena]

em script.c 

add isso

BUILDIN(atack)
{
	struct map_session_data *sd = script->rid2sd(st);
	int value = script_getnum(st,2);
	
	if (sd == NULL)
		return true;

	sd->state.atk_liberado = (value)?1:0;
	return true;
}

antes disso

// declarations that were supposed to be exported from npc_chat.c

ainda em script.c

add isso

BUILDIN_DEF(atack,"i"),

depois disso

BUILDIN_DEF(blockcheck,""), //Proteção de Conta

e aqui esta o NPC de teste

prontera,154,175,5	script	ONN	4_M_GUSLIMAN,{

	atack 1;
	end;
}

prontera,159,173,5	script	OFF	4_M_GUSLIMAN,{

	atack 0;
	end;
}

@detalhe

Usei o PORING como teste. Depois coloca ai o monstro de acordo com seu sistema ai.

@OFF 

Depois vou criar um diff para deixar para quem quiser baixar e implementar isso no servidor. Da para fazer ótimos eventos com isso.

 

@edit

Lembrando que dessa forma que eu criei ao relogar o personagem volta a ficar bloqueado de atacar o monstro. Mas da para criar uma verificação para mesmo que ele relogue ele continue podendo atacar.

Editado por Orce
1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 14/08/2017 at 23:10, Vermillion disse:

Estou criando um monstro que não poderá ser atingido a não ser que uma certa variável seja 1 no personagem. O código que estou tentando usar é esse:

battle.c(7650)

Sendo MOBID_OREMINE1 o ID do monstro, e abaixo do primeiro 'return 0;' linhas oficiais do emulador. Não consigo mais atacar o monstro, mas porque ao ter varíavel "PickOn"==1 eu ainda não consigo atacá-lo? O que está errado aí? Existe como colocar itens equipados como condição também?


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.

Editado por Tio Akima
4

Compartilhar este post


Link para o post
Compartilhar em outros sites
36 minutos atrás, Tio Akima disse:


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.

Bem elaborado. 

0

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 8/17/2017 at 02:53, Tio Akima disse:


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.

Esse @Tio Akima é foda! =D

1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Orce desculpa reviver o tópico aqui, mas e se eu quiser que todos os mobs de um determinado mapa não seja atacado como devo fazer?

if ( !sd->state.atk_liberado && t_bl->type == BL_MOB && BL_UCCAST(BL_MOB, t_bl)->class_ == MOBID_PORING)

Aqui ele define um mobid mas e se eu quiser colocar na condição um mapa no lugar do monstro?

 

@edit consegui aqui criando uma nova mapflag e adicionando os mapas que eu quero nela.

Editado por Makarov
0

Compartilhar este post


Link para o post
Compartilhar em outros sites
Entre para seguir isso  
Seguidores 0