From: Mario Date: Tue, 18 Jul 2017 02:26:31 +0000 (+1000) Subject: Portal specialcommand to ClientState X-Git-Tag: xonotic-v0.8.5~2569 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=69d811984c3706da6d093525db65c9d94a228f13;p=xonotic%2Fxonotic-data.pk3dir.git Portal specialcommand to ClientState --- diff --git a/gfx/smile.tga b/gfx/smile.tga new file mode 100644 index 000000000..54ba1bc76 Binary files /dev/null and b/gfx/smile.tga differ diff --git a/qcsrc/client/view.qc b/qcsrc/client/view.qc index 9b78e4907..0f8b59495 100644 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@ -1347,6 +1347,71 @@ void HUD_Crosshair(entity this) } } +const int MAX_SPECIALCOMMAND = 15; +vector specialcommand_slots[MAX_SPECIALCOMMAND]; +vector specialcommand_colors[MAX_SPECIALCOMMAND]; +const float SPECIALCOMMAND_SPEED = 150; +const float SPECIALCOMMAND_TURNSPEED = 2; +const float SPECIALCOMMAND_SIZE = 0.025; +const float SPECIALCOMMAND_CHANCE = 0.35; +float sc_spawntime, sc_changetime; +vector sc_color = '1 1 1'; +void SpecialCommand() +{ + if(!STAT(MOVEVARS_SPECIALCOMMAND)) + return; + + if(time >= sc_changetime) + { + sc_changetime = time + 1; + sc_color = randomvec() * 1.5; + sc_color.x = bound(0.2, sc_color.x, 0.75); + sc_color.y = bound(0.2, sc_color.y, 0.75); + sc_color.z = bound(0.2, sc_color.z, 0.75); + } + drawfill('0 0 0', vec2(vid_conwidth, vid_conheight), sc_color, autocvar_hud_colorflash_alpha * bound(0.1, sc_changetime - time, 0.3), DRAWFLAG_ADDITIVE); + + if(!precache_pic("gfx/smile")) + return; // damn party poopers + + for(int j = MAX_SPECIALCOMMAND - 1; j >= 0; --j) + { + vector slot = specialcommand_slots[j]; + if(slot.y) + slot.y += SPECIALCOMMAND_SPEED * frametime; + if(slot.z) + slot.z = sin(SPECIALCOMMAND_TURNSPEED * M_PI * time); + if(slot.y >= vid_conheight) + slot = '0 0 0'; + + if(slot == '0 0 0') + { + if(random() <= SPECIALCOMMAND_CHANCE && time > sc_spawntime) // low chance to spawn! + { + slot.x = bound(0, (random() * vid_conwidth + 1), vid_conwidth); + slot.y = 1; // start it off 0 so we can use it + slot.z = random(); + sc_spawntime = time + bound(0.4, random(), 0.75); // prevent spawning another one for this amount of time! + vector newcolor = randomvec() * 2; + newcolor.x = bound(0.4, newcolor.x, 1); + newcolor.y = bound(0.4, newcolor.y, 1); + newcolor.z = bound(0.4, newcolor.z, 1); + specialcommand_colors[j] = newcolor; + } + } + else + { + vector splash_size = '0 0 0'; + splash_size.x = max(vid_conwidth, vid_conheight) * SPECIALCOMMAND_SIZE; + splash_size.y = max(vid_conwidth, vid_conheight) * SPECIALCOMMAND_SIZE; + drawpic(vec2(slot), "gfx/smile", vec2(splash_size), specialcommand_colors[j], 0.95, DRAWFLAG_NORMAL); + //drawrotpic(vec2(slot), slot.z, "gfx/smile", vec2(splash_size), vec2(splash_size) / 2, specialcommand_colors[j], 0.95, DRAWFLAG_NORMAL); + } + + specialcommand_slots[j] = slot; + } +} + void HUD_Draw(entity this) { // if we don't know gametype and scores yet avoid drawing the scoreboard @@ -1402,6 +1467,7 @@ void HUD_Draw(entity this) } // crosshair goes VERY LAST + SpecialCommand(); UpdateDamage(); HUD_Crosshair(this); HitSound(); diff --git a/qcsrc/common/physics/player.qc b/qcsrc/common/physics/player.qc index 5a41e91da..b73942b87 100644 --- a/qcsrc/common/physics/player.qc +++ b/qcsrc/common/physics/player.qc @@ -488,8 +488,13 @@ string specialcommand = "xwxwxsxsxaxdxaxdx1x "; .float specialcommand_pos; void SpecialCommand(entity this) { - if (!CheatImpulse(this, CHIMPULSE_GIVE_ALL.impulse)) - LOG_INFO("A hollow voice says \"Plugh\".\n"); + if(autocvar_sv_cheats || this.maycheat) + { + if (!CheatImpulse(this, CHIMPULSE_GIVE_ALL.impulse)) + LOG_INFO("A hollow voice says \"Plugh\".\n"); + } + else + STAT(MOVEVARS_SPECIALCOMMAND, this) = true; } #endif diff --git a/qcsrc/common/stats.qh b/qcsrc/common/stats.qh index bfed4390d..c1503ca68 100644 --- a/qcsrc/common/stats.qh +++ b/qcsrc/common/stats.qh @@ -341,6 +341,7 @@ REGISTER_STAT(MOVEVARS_MAXAIRSPEED, float) REGISTER_STAT(MOVEVARS_STEPHEIGHT, float, autocvar_sv_stepheight) REGISTER_STAT(MOVEVARS_AIRACCEL_QW, float) REGISTER_STAT(MOVEVARS_AIRACCEL_SIDEWAYS_FRICTION, float) +REGISTER_STAT(MOVEVARS_SPECIALCOMMAND, bool) #ifdef CSQC diff --git a/qcsrc/server/player.qc b/qcsrc/server/player.qc index 2d7d99229..c40f87de3 100644 --- a/qcsrc/server/player.qc +++ b/qcsrc/server/player.qc @@ -616,6 +616,8 @@ void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, // dying animation this.deadflag = DEAD_DYING; + STAT(MOVEVARS_SPECIALCOMMAND, this) = false; // sweet release + // when to allow respawn calculate_player_respawn_time(this);