- m_shooting_timer -= dtime;
- if(m_shooting_timer <= 0.0 && m_shooting){
- m_shooting = false;
-
- std::string shoot_type = m_properties->get("shoot_type");
- v3f shoot_pos(0,0,0);
- shoot_pos.Y += m_properties->getFloat("shoot_y") * BS;
- if(shoot_type == "fireball"){
- v3f dir(cos(m_yaw/180*PI),0,sin(m_yaw/180*PI));
- dir.Y = m_shoot_y;
- dir.normalize();
- v3f speed = dir * BS * 10.0;
- v3f pos = m_base_position + shoot_pos;
- infostream<<__FUNCTION_NAME<<": Mob id="<<m_id
- <<" shooting fireball from "<<PP(pos)
- <<" at speed "<<PP(speed)<<std::endl;
- Settings properties;
- properties.set("looks", "fireball");
- properties.setV3F("speed", speed);
- properties.setFloat("die_age", 5.0);
- properties.set("move_type", "constant_speed");
- properties.setFloat("hp", 1000);
- properties.set("lock_full_brightness", "true");
- properties.set("player_hit_damage", "9");
- properties.set("player_hit_distance", "2");
- properties.set("player_hit_interval", "1");
- ServerActiveObject *obj = new MobV2SAO(m_env,
- pos, &properties);
- //m_env->addActiveObjectAsStatic(obj);
- m_env->addActiveObject(obj);
- } else {
- infostream<<__FUNCTION_NAME<<": Mob id="<<m_id
- <<": Unknown shoot_type="<<shoot_type
- <<std::endl;
- }
- }
-
- m_shoot_reload_timer += dtime;
-
- float reload_time = 15.0;
- if(m_disturb_timer <= 15.0)
- reload_time = 3.0;
-
- bool shoot_without_player = false;
- if(m_properties->getBool("mindless_rage"))
- shoot_without_player = true;
-
- if(!m_shooting && m_shoot_reload_timer >= reload_time &&
- !m_next_pos_exists &&
- (m_disturb_timer <= 60.0 || shoot_without_player))
- {
- m_shoot_y = 0;
- if(m_disturb_timer < 60.0 && disturbing_player &&
- disturbing_player_distance < 16*BS &&
- fabs(disturbing_player_norm.Y) < 0.8){
- m_yaw = disturbing_player_dir;
- sendPosition();
- m_shoot_y += disturbing_player_norm.Y;
- } else {
- m_shoot_y = 0.01 * myrand_range(-30,10);
- }
- m_shoot_reload_timer = 0.0;
- m_shooting = true;
- m_shooting_timer = 1.5;
- {
- std::ostringstream os(std::ios::binary);
- // command (2 = shooting)
- writeU8(os, 2);
- // time
- writeF1000(os, m_shooting_timer + 0.1);
- // bright?
- writeU8(os, true);
- // create message and add to list
- ActiveObjectMessage aom(getId(), false, os.str());
- m_messages_out.push_back(aom);
- }
- }