]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Add an experimental barricade
authorMario <mario.mario@y7mail.com>
Wed, 27 Feb 2013 11:29:58 +0000 (22:29 +1100)
committerMario <mario.mario@y7mail.com>
Wed, 27 Feb 2013 11:29:58 +0000 (22:29 +1100)
gamemodes.cfg
models/td/barricade.md3 [new file with mode: 0644]
qcsrc/server/autocvars.qh
qcsrc/server/mutators/gamemode_td.qc
scripts/barricade.shader [new file with mode: 0644]
scripts/shaderlist.txt
textures/barricade.tga [new file with mode: 0644]
textures/barricade_norm.tga [new file with mode: 0644]

index d10cf82d71a28580bdb76695e7f7430a029b7229..2ede763d8c4b1dad5458c9b316e317b4be5d7344 100644 (file)
@@ -507,6 +507,8 @@ set g_td_turret_plasma_cost 50
 set g_td_turret_mlrs_cost 80
 set g_td_turret_walker_cost 100
 set g_td_tower_buff_cost 70
+set g_td_barricade_damage 10
+set g_td_barricade_cost 20
 set g_td_turret_flac_cost 40
 set g_td_turret_upgrade_cost 100
 set g_td_turret_repair_cost 20
diff --git a/models/td/barricade.md3 b/models/td/barricade.md3
new file mode 100644 (file)
index 0000000..8d58d9b
Binary files /dev/null and b/models/td/barricade.md3 differ
index ff8d5b66eeb3b16a0111acf043f0dfe765d9fe28..641bf0cd2b3a0fb8ad5d43b0c8af9cb3eaaaff2d 100644 (file)
@@ -1299,6 +1299,8 @@ float autocvar_g_td_monsters_spawn_delay;
 float autocvar_g_td_monsters_spawnshield_time;
 float autocvar_g_td_turret_upgrade_cost;
 float autocvar_g_td_turret_repair_cost;
+float autocvar_g_td_barricade_damage;
+float autocvar_g_td_barricade_cost;
 float autocvar_g_za_monster_count;
 float autocvar_g_monsters;
 float autocvar_g_monsters_max;
index 56ea5e82313f52f872dcb925adf2f968da4b2820..ca1168b21a30be245925c50cd9d99ecf5a37ce3e 100644 (file)
@@ -220,6 +220,72 @@ void spawnfunc_monster_swarm()
                print("Warning: monster_swarm entity without a valid target\n");
 }
 
+void barricade_touch()
+{
+       if not(other.flags & FL_MONSTER)
+               return;
+               
+       if(time < self.dmg_time)
+               return;
+               
+       Damage(other, self, self, autocvar_g_td_barricade_damage, DEATH_HURTTRIGGER, self.origin, '0 0 0');
+       
+       self.dmg_time = time + 1;
+}
+
+void barricade_die()
+{
+       self.takedamage = DAMAGE_NO;
+       self.event_damage = func_null;
+       
+       pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1);
+       sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+       
+       if(self.realowner)
+               self.realowner.turret_cnt -= 1;
+               
+       self.think = SUB_Remove;
+       self.nextthink = time;
+}
+
+void barricade_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+       if not(attacker.flags & FL_MONSTER) return;
+       
+       self.health -= damage;
+       
+       WaypointSprite_UpdateHealth(self.sprite, self.health);
+       
+       if(self.health < 1)
+               barricade_die();
+}
+
+void spawn_barricade()
+{
+       self.health = 2000;
+       self.max_health = self.health;
+       self.dmg_time = time;
+       self.touch = barricade_touch;
+       self.think = func_null;
+       self.nextthink = -1;
+       self.takedamage = DAMAGE_AIM;
+       self.turrcaps_flags = TFL_TURRCAPS_ISTURRET; // for turretremove commands etc.
+       self.solid = SOLID_BBOX;
+       self.event_damage = barricade_damage;
+       self.netname = "Barricade";
+       
+       WaypointSprite_Spawn(self.netname, 0, 1200, self, '0 0 110', world, 0, self, sprite, FALSE, RADARICON_DOMPOINT, '1 1 0');       
+       WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health);
+       WaypointSprite_UpdateHealth(self.sprite, self.health);
+       
+       precache_model("models/td/barricade.md3");
+       setmodel(self, "models/td/barricade.md3");
+       
+       droptofloor();
+       
+       self.movetype = MOVETYPE_NONE;
+}
+
 void spawnturret(entity spawnedby, entity own, string turet, vector orig)
 {
        if(spawnedby.classname != STR_PLAYER)
@@ -252,6 +318,7 @@ void spawnturret(entity spawnedby, entity own, string turet, vector orig)
                case "flac": spawnfunc_turret_flac(); break;
                case "tesla": spawnfunc_turret_tesla(); break;
                case "fusionreactor": spawnfunc_turret_fusionreactor(); break;
+               case "barricade": spawn_barricade(); break;
        }
                
        self = oldself;
@@ -867,7 +934,7 @@ MUTATOR_HOOKFUNCTION(td_MonsterFindTarget)
        for(e = world;(e = findflags(e, monster_attack, TRUE)); ) 
        {
                if(monster_isvalidtarget(e, self, FALSE))
-               if((vlen(trace_endpos - self.origin) < 100 && e.turrcaps_flags & TFL_TURRCAPS_ISTURRET) || (vlen(trace_endpos - self.origin) < 200 && e.classname != "td_generator") || (vlen(trace_endpos - self.origin) < 500 && e.classname == "td_generator"))
+               if((vlen(trace_endpos - self.origin) < 200 && e.turrcaps_flags & TFL_TURRCAPS_ISTURRET) || (vlen(trace_endpos - self.origin) < 200 && e.classname != "td_generator") || (vlen(trace_endpos - self.origin) < 500 && e.classname == "td_generator"))
                {
                        self.enemy = e;
                }
@@ -965,6 +1032,14 @@ MUTATOR_HOOKFUNCTION(td_PlayerCommand)
                                sprint(self, "Spawned 1 tower buff turret\n");
                                return TRUE;
                        }
+                       case "barricade":
+                       {
+                               if(self.ammo_fuel < autocvar_g_td_barricade_cost) break;
+                               self.ammo_fuel -= autocvar_g_td_barricade_cost;
+                               spawnturret(self, self, "barricade", trace_endpos);
+                               sprint(self, "Spawned 1 barricade\n");
+                               return TRUE;
+                       }
                        default:
                        {
                                sprint(self, "Invalid turret. type 'cmd turret list' to see a list of all available turrets.\n");
@@ -1030,6 +1105,7 @@ MUTATOR_HOOKFUNCTION(td_PlayerCommand)
                {
                        self.turret_cnt -= 1;
                        sprint(self, strcat("You removed your ", trace_ent.netname, "\n"));
+                       WaypointSprite_Kill(trace_ent.sprite);
                        remove(trace_ent.tur_head);
                        remove(trace_ent);
                        return TRUE;
diff --git a/scripts/barricade.shader b/scripts/barricade.shader
new file mode 100644 (file)
index 0000000..c650b5b
--- /dev/null
@@ -0,0 +1,8 @@
+barricade
+{
+ cull none
+ {
+       map textures/barricade.tga
+ }
+}
+
index c3ac98f2c57142ad9aecadd1d902dbe76ef4a2fc..8ed9769d00bf8942f3f4aaf6cfbd73a5dafd2e83 100644 (file)
@@ -15,3 +15,4 @@ tuba
 turrets
 weapons
 mage
+barricade
diff --git a/textures/barricade.tga b/textures/barricade.tga
new file mode 100644 (file)
index 0000000..d9cd774
Binary files /dev/null and b/textures/barricade.tga differ
diff --git a/textures/barricade_norm.tga b/textures/barricade_norm.tga
new file mode 100644 (file)
index 0000000..e664ed4
Binary files /dev/null and b/textures/barricade_norm.tga differ