//========================================================= // 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); } }
//========================================================= // 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 ); } }
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); }
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; } }