Exemplo n.º 1
0
//=========================================================
// ALertSound - scream
//=========================================================
void CISlave::AlertSound(void)
{
	if(m_hEnemy != NULL)
	{
		SENTENCEG_PlayRndSz(ENT(pev), "SLV_ALERT", 0.85, ATTN_NORM, 0, m_voicePitch);

		CallForHelp("monster_alien_slave", 512, m_hEnemy, m_vecEnemyLKP);
	}
}
Exemplo n.º 2
0
//=========================================================
// ALertSound - scream
//=========================================================
void CNPC_Vortigaunt::AlertSound( void )
{
    if ( GetEnemy() != NULL )
    {
        SENTENCEG_PlayRndSz( edict(), "SLV_ALERT", 0.85, SNDLVL_NORM, 0, m_iVoicePitch );

        Vector vecTmp = GetEnemy()->GetAbsOrigin();
        CallForHelp( "monster_alien_slave", 512, GetEnemy(), vecTmp );
    }
}
Exemplo n.º 3
0
void CMobEntity::Spawn()
{
    CBattleEntity::Spawn();
    m_giveExp = true;
    m_HiPCLvl = 0;
    m_THLvl = 0;
    m_ItemStolen = false;
    m_DropItemTime = 1000;
    animationsub = getMobMod(MOBMOD_SPAWN_ANIMATIONSUB);
    CallForHelp(false);

    PEnmityContainer->Clear();

    uint8 level = m_minLevel;

    // Generate a random level between min and max level
    if (m_maxLevel != m_minLevel)
    {
        level += dsprand::GetRandomNumber(0, m_maxLevel - m_minLevel);
    }

    SetMLevel(level);
    SetSLevel(level);//calculated in function
    delRageMode();

    mobutils::CalculateStats(this);
    mobutils::GetAvailableSpells(this);

    // spawn somewhere around my point
    loc.p = m_SpawnPoint;

    if (m_roamFlags & ROAMFLAG_STEALTH)
    {
        HideName(true);
        Untargetable(true);
    }

    // add people to my posse
    if (getMobMod(MOBMOD_ASSIST))
    {
        for (int8 i = 1; i < getMobMod(MOBMOD_ASSIST) + 1; i++)
        {
            CMobEntity* PMob = (CMobEntity*)GetEntity(targid + i, TYPE_MOB);

            if (PMob != nullptr)
            {
                PMob->setMobMod(MOBMOD_SUPERLINK, targid);
            }
        }
    }
    
    m_DespawnTimer = time_point::min();
    luautils::OnMobSpawn(this);
}
Exemplo n.º 4
0
void Character::UpdateState(std::array<Character *, 3> heroes, std::vector<Character *> monsters, double dt, MsgBoard &msgboard)
{
	float monsterDist = 100;
	Character *monster;
	for (Character *iter : monsters)
	{
		if (glm::distance(iter->getPos(), getPos()) < monsterDist)
		{
			monsterDist = glm::distance(iter->getPos(), getPos());
			monster = iter;
		}
	}
	switch (role)
	{
	case ROLE::KNIGHT:
		if (attacked)
		{
			if (attacker == NULL) attacked = false;
			CallForHeal(heroes, msgboard);
		}
		if (getMaxHP() > hp)
		{
			msgboard.msgboard.at(1) = false;
		}
		if (state == STATE::KNIGHT_PROTECT)
		{
			if (target == attacker) state = STATE::KNIGHT_ATTACK;
		}
		else
		{
			if (monsterDist < 2)
			{
				state = STATE::KNIGHT_ATTACK;
			}
			else if (monsterDist < 15)
			{
				state = STATE::KNIGHT_MOVE;
				target = monster;
			}
			else
				state = STATE::KNIGHT_IDLE;
		}
		break;
	case ROLE::ARCHER:
		if (attacked)
		{
			if (attacker == NULL || glm::distance(getPos(), attacker->getPos()) > 5) attacked = false;
			else
			{
				state = STATE::ARCHER_RETREAT;
				CallForHelp(heroes, msgboard);
			}
		}
		if (!attacked)
		{
			msgboard.msgboard.at(0) = false;
			if (monsterDist < 10)
			{
				state = STATE::ARCHER_ATTACK;
			}
			else if (monsterDist < 20)
			{
				state = STATE::ARCHER_MOVE;
				target = monster;
			}
			else
				state = STATE::ARCHER_IDLE;
		}
		break;
	case ROLE::HEALER:
		if (attacked)
		{
			if (attacker == NULL || glm::distance(getPos(), attacker->getPos()) > 5) attacked = false;
			else state = STATE::ARCHER_RETREAT;
			CallForHelp(heroes, msgboard);
		} 
		if (!attacked)
		{
			Character *knight;
			for (int count = 0; count < 3; ++count)
			{
				if (heroes[count]->role == ROLE::KNIGHT) knight = heroes[count];
			}
			if (glm::distance(getPos(), knight->getPos()) > 5)
			{
				state = STATE::HEALER_MOVE;
				target = knight;
			}
			else
				state = STATE::HEALER_HEAL;
		}
		break;
	case ROLE::MONSTER:
	{
						  Character closestHero;
						  float dist = 15;
						  for (int count = 0; count < 3; ++count)
						  {
							  if (glm::distance(getPos(), heroes[count]->getPos()) < dist)
							  {
								  dist = glm::distance(getPos(), heroes[count]->getPos());
								  target = heroes[count];
								  targetReached = true;
							  }
						  }
						  if (dist < 2)
							  state = STATE::MONSTER_ATTACK;
						  else if (dist < 15)
							  state = STATE::MONSTER_MOVE;
						  else
						  {
							  if (!targetReached)
							  {
								  if (glm::distance(getPos(), target->getPos()) < 2)
								  {
									  delete target;
									  targetReached = true;
								  }
							  }
							  if (targetReached)
							  {
								  target = new Character();
								  target->object = new Object();
								  target->object->translation = glm::translate(glm::vec3(rand() % 100 - 50, rand() % 80 - 40, 0));
								  state = STATE::MONSTER_PATROL;
								  targetReached = false;
							  }
						  }
	}
		break;
	default:
		break;
	}
}