Exemplo n.º 1
0
void CMobEntity::OnMobSkillFinished(CMobSkillState& state, action_t& action)
{

    auto PSkill = state.GetSkill();
    auto PTarget = static_cast<CBattleEntity*>(state.GetTarget());

    static_cast<CMobController*>(PAI->GetController())->TapDeaggroTime();

    // store the skill used
    m_UsedSkillIds[PSkill->getID()] = GetMLevel();

    PAI->TargetFind->reset();

    float distance = PSkill->getDistance();
    uint8 findFlags = 0;
    if (PSkill->getFlag() & SKILLFLAG_HIT_ALL)
    {
        findFlags |= FINDFLAGS_HIT_ALL;
    }

    // Mob buff abilities also hit monster's pets
    if (PSkill->getValidTargets() == TARGET_SELF)
    {
        findFlags |= FINDFLAGS_PET;
    }

    action.id = id;
    if (objtype == TYPE_PET && static_cast<CPetEntity*>(this)->getPetType() == PETTYPE_JUG_PET &&
        static_cast<CPetEntity*>(this)->getPetType() == PETTYPE_AUTOMATON)
        action.actiontype = ACTION_PET_MOBABILITY_FINISH;
    else if (PSkill->getID() < 256)
        action.actiontype = ACTION_WEAPONSKILL_FINISH;
    else
        action.actiontype = ACTION_MOBABILITY_FINISH;
    action.actionid = PSkill->getID();

    if (PTarget && PAI->TargetFind->isWithinRange(&PTarget->loc.p, distance))
    {
        if (PSkill->isAoE())
        {
            PAI->TargetFind->findWithinArea(PTarget, (AOERADIUS)PSkill->getAoe(), PSkill->getRadius(), findFlags);
        }
        else if (PSkill->isConal())
        {
            float angle = 45.0f;
            PAI->TargetFind->findWithinCone(PTarget, distance, angle, findFlags);
        }
        else
        {
            PAI->TargetFind->findSingleTarget(PTarget, findFlags);
        }
    }
    else
    {
        action.actiontype = ACTION_MOBABILITY_INTERRUPT;
        actionList_t& actionList = action.getNewActionList();
        actionList.ActionTargetID = id;

        actionTarget_t& actionTarget = actionList.getNewActionTarget();
        actionTarget.animation = PSkill->getID();
        return;
    }

    uint16 actionsLength = PAI->TargetFind->m_targets.size();

    PSkill->setTotalTargets(actionsLength);
    PSkill->setTP(state.GetSpentTP());
    PSkill->setHPP(GetHPP());

    uint16 msg = 0;
    uint16 defaultMessage = PSkill->getMsg();

    bool first {true};
    for (auto&& PTarget : PAI->TargetFind->m_targets)
    {
        actionList_t& list = action.getNewActionList();

        list.ActionTargetID = PTarget->id;

        actionTarget_t& target = list.getNewActionTarget();

        list.ActionTargetID = PTarget->id;
        target.reaction = REACTION_HIT;
        target.speceffect = SPECEFFECT_HIT;
        target.animation = PSkill->getAnimationID();
        target.messageID = PSkill->getMsg();


        // reset the skill's message back to default
        PSkill->setMsg(defaultMessage);

        if (objtype == TYPE_PET && static_cast<CPetEntity*>(this)->getPetType() != PETTYPE_JUG_PET)
        {
            target.animation = PSkill->getPetAnimationID();
            target.param = luautils::OnPetAbility(PTarget, this, PSkill, PMaster, &action);
        }
        else
        {
            target.param = luautils::OnMobWeaponSkill(PTarget, this, PSkill);
        }

        if (msg == 0)
        {
            msg = PSkill->getMsg();
        }
        else
        {
            msg = PSkill->getAoEMsg();
        }

        target.messageID = msg;

        if (PSkill->hasMissMsg())
        {
            target.reaction = REACTION_MISS;
            target.speceffect = SPECEFFECT_NONE;
            if (msg = PSkill->getAoEMsg())
                msg = 282;
        }
        else
        {
            target.reaction = REACTION_HIT;
        }

        if (target.speceffect & SPECEFFECT_HIT)
        {
            target.speceffect = SPECEFFECT_RECOIL;
            target.knockback = PSkill->getKnockback();
            if (first && (PSkill->getSkillchain() != 0))
            {
                CWeaponSkill* PWeaponSkill = battleutils::GetWeaponSkill(PSkill->getSkillchain());
                if (PWeaponSkill)
                {
                    SUBEFFECT effect = battleutils::GetSkillChainEffect(PTarget, PWeaponSkill);
                    if (effect != SUBEFFECT_NONE)
                    {
                        int32 skillChainDamage = battleutils::TakeSkillchainDamage(this, PTarget, target.param);
                        if (skillChainDamage < 0)
                        {
                            target.addEffectParam = -skillChainDamage;
                            target.addEffectMessage = 384 + effect;
                        }
                        else
                        {
                            target.addEffectParam = skillChainDamage;
                            target.addEffectMessage = 287 + effect;
                        }
                        target.additionalEffect = effect;
                    }
                }
                first = false;
            }
        }
        PTarget->StatusEffectContainer->DelStatusEffectsByFlag(EFFECTFLAG_DETECTABLE);
    }
}
Exemplo n.º 2
0
int main(int argc, char **argv){
	int rank,size,i,j;
	MPI_Status status;
	//MPI_Request *request;
	char **pCrackL;
	char *dados;
	//char *dadosS;
	//char **saltL;
	PassSlice *slices;
	char fileName[] = "input.in";
	int qtPTC=0;
	//char *t;
	FILE *file;
	char src[14];
	int TP = 1;
	//MPI_File fh;
	//int filesize;
	//I_MPI_MT_MEMCPY=1;
	//int tDes = getDes();

	MPI_Init(&argc,&argv);

	MPI_Comm_rank(MPI_COMM_WORLD,&rank);
	MPI_Comm_size(MPI_COMM_WORLD,&size); 	

	//qtPTC = atoi(argv[1]);

	//pCrackL=(char*)malloc(qtPTC*getTDes()*sizeof(char));
	//saltL=(char*)malloc(qtPTC*getTS()*sizeof(char));


	if(rank == 0){	
		file = fopen(fileName,"r");

		for(i=0 ; fscanf(file,"%s",src)!=EOF ; i++ );
		fseek(file,0,SEEK_SET);	
		qtPTC = i;
		dados = (char*)malloc(qtPTC*(getTDes()+1)*sizeof(char));
		if(dados==NULL)exit(0);
		pCrackL = (char**)malloc(sizeof(char*)*(qtPTC+1));
		if(pCrackL==NULL)exit(0);
		for(i = 0 ; i < qtPTC ; i++)pCrackL[i]=&(dados[i*(getTDes()+1)]);

		for(i=0 ; i < (qtPTC-1) ; i++ ){
			fscanf(file,"%s",pCrackL[i]);
		}
		fclose(file);
		setTP(TP);
		for(i = 0 ; i < getTP() ; i++){
			slices = initSlices(size-1);		
			/*for(i=0;i<size-1;i++){
			  printf("%i\n",slices[i].interval);
			  printf("%i\n",slices[i].tPass);
			  printf("%s\n",slices[i].begin);
			  printf("%s\n",slices[i].end);	
			  }*/
			for(j=1;j<size;j++){
				MPI_Send(&TP,1,MPI_INT,i,2,MPI_COMM_WORLD);
				MPI_Send(slices[i].begin,TP,MPI_CHAR,i,0,MPI_COMM_WORLD);
				MPI_Send(&slices[i].interval,1,MPI_UNSIGNED_LONG,i,1,MPI_COMM_WORLD);
			}
			TP++;
			setTP(TP);
		}
	} else {
		MPI_Recv(&TP,1,MPI_INT,0,2,MPI_COMM_WORLD,&status);
		MPI_Recv(slices[rank].begin,TP,MPI_CHAR,0,0,MPI_COMM_WORLD,&status);
		MPI_Recv(&slices[rank].interval,1,MPI_UNSIGNED_LONG,0,1,MPI_COMM_WORLD,&status);
	}
	MPI_Bcast (&qtPTC, 1, MPI_INT, 0, MPI_COMM_WORLD);	
	if(rank!=0){
		dados = (char*)malloc(qtPTC*(getTDes()+1)*sizeof(char));
		if(dados==NULL)exit(0);
		pCrackL = (char**)malloc(sizeof(char*)*(qtPTC+1));
		if(pCrackL==NULL)exit(0);
		for(i = 0 ; i < qtPTC ; i++)pCrackL[i]=&(dados[i*(getTDes()+1)]);
	
	}
	//pCrackL=(char*)malloc(qtPTC*getTDes()*sizeof(char));
	//MPI_Bcast (&qtPTC, 1, MPI_INT, 0, MPI_COMM_WORLD);
	//MPI_Barrier(MPI_COMM_WORLD);
	//MPI_Bcast (dados, qtPTC*(getTDes()+1), MPI_CHAR, 0, MPI_COMM_WORLD);
	//for(i=0;i<qtPTC;i++)pCrackL[i] = &dados[i*(getTDes()+1)];
	//MPI_Bcast (saltL, qtPTC*getTS(), MPI_CHAR, 0, MPI_COMM_WORLD);
	//for(i = 0 ; i < qtPTC ; i++){
	//printf("%i %i \n",qtPTC,rank);
	//}
	//printf("%s\n",pCrackL[0]);
	//setTp(1);
	//openMP(pCrackL, saltL, qtPTC);

	MPI_Finalize();
	return 0;
}