+ if(!instance.gunner2)
+ if(time >= instance.gun2.phase)
+ if(instance.gun2.vehicle_enter)
+ if(instance.gun2.vehicle_enter(instance, actor))
+ return;
+}
+METHOD(Bumblebee, vr_think, void(Bumblebee thisveh, entity instance))
+{
+ instance.angles_z *= 0.8;
+ instance.angles_x *= 0.8;
+
+ instance.nextthink = time;
+
+ if(!instance.owner)
+ {
+ if(instance.gunner1)
+ {
+ entity e = instance.gunner1;
+ instance.gun1.vehicle_exit(instance.gun1, VHEF_EJECT);
+ instance.phase = 0;
+ gettouch(instance)(instance, e);
+ return;
+ }
+
+ if(instance.gunner2)
+ {
+ entity e = instance.gunner2;
+ instance.gun2.vehicle_exit(instance.gun2, VHEF_EJECT);
+ instance.phase = 0;
+ gettouch(instance)(instance, e);
+ return;
+ }
+ }
+}
+METHOD(Bumblebee, vr_death, void(Bumblebee thisveh, entity instance))
+{
+ CSQCModel_UnlinkEntity(instance);
+
+ // hide beam
+ if(instance.gun3.enemy || !wasfreed(instance.gun3.enemy))
+ instance.gun3.enemy.effects |= EF_NODRAW;
+
+ if(instance.gunner1)
+ instance.gun1.vehicle_exit(instance.gun1, VHEF_EJECT);
+
+ if(instance.gunner2)
+ instance.gun2.vehicle_exit(instance.gun2, VHEF_EJECT);
+
+ instance.vehicle_exit(instance, VHEF_EJECT);
+
+ fixedmakevectors(instance.angles);
+ vehicle_tossgib(instance, instance.gun1, instance.velocity + v_right * 300 + v_up * 100 + randomvec() * 200, "cannon_right", rint(random()), rint(random()), 6, randomvec() * 200);
+ vehicle_tossgib(instance, instance.gun2, instance.velocity + v_right * -300 + v_up * 100 + randomvec() * 200, "cannon_left", rint(random()), rint(random()), 6, randomvec() * 200);
+ vehicle_tossgib(instance, instance.gun3, instance.velocity + v_forward * 300 + v_up * -100 + randomvec() * 200, "raygun", rint(random()), rint(random()), 6, randomvec() * 300);
+
+ entity _body = vehicle_tossgib(instance, instance, instance.velocity + randomvec() * 200, "", rint(random()), rint(random()), 6, randomvec() * 100);
+
+ if(random() > 0.5)
+ settouch(_body, bumblebee_dead_touch);
+ else
+ settouch(_body, func_null);
+
+ setthink(_body, bumblebee_diethink);
+ _body.nextthink = time;
+ _body.wait = time + 2 + (random() * 8);
+ _body.owner = instance;
+ _body.enemy = instance.enemy;
+ _body.scale = 1.5;
+ _body.angles = instance.angles;
+
+ Send_Effect(EFFECT_EXPLOSION_MEDIUM, findbetterlocation(instance.origin, 16), '0 0 0', 1);
+
+ instance.health = 0;
+ instance.event_damage = func_null;
+ instance.solid = SOLID_NOT;
+ instance.takedamage = DAMAGE_NO;
+ instance.deadflag = DEAD_DYING;
+ set_movetype(instance, MOVETYPE_NONE);
+ instance.effects = EF_NODRAW;
+ instance.colormod = '0 0 0';
+ instance.avelocity = '0 0 0';
+ instance.velocity = '0 0 0';
+ settouch(instance, func_null);
+ instance.nextthink = 0;
+
+ setorigin(instance, instance.pos1);
+}
+METHOD(Bumblebee, vr_spawn, void(Bumblebee thisveh, entity instance))
+{
+ if(!instance.gun1)
+ {
+ // for some reason, autosizing of the shield entity refuses to work for this one so set it up in advance.
+ instance.vehicle_shieldent = spawn();
+ instance.vehicle_shieldent.effects = EF_LOWPRECISION;
+ setmodel(instance.vehicle_shieldent, MDL_VEH_BUMBLEBEE_SHIELD);
+ setattachment(instance.vehicle_shieldent, instance, "");
+ setorigin(instance.vehicle_shieldent, real_origin(instance) - instance.origin);
+ instance.vehicle_shieldent.scale = 512 / vlen(instance.maxs - instance.mins);
+ setthink(instance.vehicle_shieldent, shieldhit_think);
+ instance.vehicle_shieldent.alpha = -1;
+ instance.vehicle_shieldent.effects = EF_LOWPRECISION | EF_NODRAW;
+
+ instance.gun1 = new(vehicle_playerslot);
+ instance.gun2 = new(vehicle_playerslot);
+ instance.gun3 = new(bumblebee_raygun);
+
+ instance.vehicle_flags |= VHF_MULTISLOT;
+
+ instance.gun1.owner = instance;
+ instance.gun2.owner = instance;
+ instance.gun3.owner = instance;
+
+ setmodel(instance.gun1, MDL_VEH_BUMBLEBEE_CANNON_RIGHT);
+ setmodel(instance.gun2, MDL_VEH_BUMBLEBEE_CANNON_LEFT);
+ setmodel(instance.gun3, MDL_VEH_BUMBLEBEE_CANNON_CENTER);
+
+ setattachment(instance.gun1, instance, "cannon_right");
+ setattachment(instance.gun2, instance, "cannon_left");
+
+ // Angled bones are no fun, messes up gun-aim; so work arround it.
+ instance.gun3.pos1 = instance.angles;
+ instance.angles = '0 0 0';
+ vector ofs = gettaginfo(instance, gettagindex(instance, "raygun"));
+ ofs -= instance.origin;
+ setattachment(instance.gun3, instance, "");
+ setorigin(instance.gun3, ofs);
+ instance.angles = instance.gun3.pos1;
+
+ vehicle_addplayerslot(instance, instance.gun1, HUD_BUMBLEBEE_GUN, MDL_VEH_BUMBLEBEE_GUNCOCKPIT, bumblebee_gunner_frame, bumblebee_gunner_exit, bumblebee_gunner_enter);
+ vehicle_addplayerslot(instance, instance.gun2, HUD_BUMBLEBEE_GUN, MDL_VEH_BUMBLEBEE_GUNCOCKPIT, bumblebee_gunner_frame, bumblebee_gunner_exit, bumblebee_gunner_enter);
+
+ setorigin(instance.vehicle_hudmodel, '50 0 -5'); // Move cockpit forward - down.
+ setorigin(instance.vehicle_viewport, '5 0 2'); // Move camera forward up
+
+ //fixme-model-bones
+ setorigin(instance.gun1.vehicle_hudmodel, '90 -27 -23');
+ setorigin(instance.gun1.vehicle_viewport, '-85 0 50');
+ //fixme-model-bones
+ setorigin(instance.gun2.vehicle_hudmodel, '90 27 -23');
+ setorigin(instance.gun2.vehicle_viewport, '-85 0 50');
+
+ instance.scale = 1.5;
+
+ // Raygun beam
+ if(instance.gun3.enemy == NULL)
+ {
+ instance.gun3.enemy = spawn();
+ Net_LinkEntity(instance.gun3.enemy, true, 0, bumble_raygun_send);
+ instance.gun3.enemy.SendFlags = BRG_SETUP;
+ instance.gun3.enemy.cnt = autocvar_g_vehicle_bumblebee_raygun;
+ instance.gun3.enemy.effects = EF_NODRAW | EF_LOWPRECISION;
+ }
+ }
+
+ if(!autocvar_g_vehicle_bumblebee_swim)
+ instance.dphitcontentsmask |= DPCONTENTS_LIQUIDSMASK;
+
+ instance.vehicle_health = autocvar_g_vehicle_bumblebee_health;
+ instance.vehicle_shield = autocvar_g_vehicle_bumblebee_shield;
+ instance.solid = SOLID_BBOX;
+ set_movetype(instance, MOVETYPE_TOSS);
+ instance.damageforcescale = 0.025;
+
+ instance.PlayerPhysplug = bumblebee_pilot_frame;
+
+ setorigin(instance, instance.origin + '0 0 25');
+}
+METHOD(Bumblebee, vr_setup, void(Bumblebee thisveh, entity instance))
+{
+ if(autocvar_g_vehicle_bumblebee_energy)
+ if(autocvar_g_vehicle_bumblebee_energy_regen)
+ instance.vehicle_flags |= VHF_ENERGYREGEN;