53 ball.nextthink =
time;
67 ball.velocity =
'0 0 0';
68 ball.origin =
'0.5 0.5 0';
82 if ( team_thrower == 0 )
83 team_thrower = team_receiver;
85 if ( team_thrower == team_receiver )
88 entity paddle_thrower = minigame.pong_paddles[team_thrower-1];
89 if ( paddle_thrower.realowner.minigame_players )
91 paddle_thrower.realowner.minigame_players.pong_score += delta;
99 return vec2( p.x > box_max.x ? box_max.x : ( p.x < box_min.x ? box_min.x : p.x ),
100 p.y > box_max.y ? box_max.y : ( p.y < box_min.y ? box_min.y : p.y ) );
107 case 1: ball.velocity_x = -
fabs(ball.velocity_x);
break;
108 case 2: ball.velocity_x =
fabs(ball.velocity_x);
break;
109 case 3: ball.velocity_y =
fabs(ball.velocity_y);
break;
110 case 4: ball.velocity_y = -
fabs(ball.velocity_y);
break;
113 float angle = atan2(ball.velocity_y, ball.velocity_x);
124 entity paddle = ball.owner.pong_paddles[pteam-1];
130 paddle.m_maxs+paddle.origin, ball.origin);
131 return vdist(near_point - ball.origin, <=, ball.pong_length);
133 return boxesoverlap(paddle.m_mins + paddle.origin, paddle.m_maxs + paddle.origin, ball.m_mins + ball.origin, ball.m_maxs + ball.origin);
140 entity paddle = ball.owner.pong_paddles[pteam-1];
160 this.origin_x += this.velocity_x * think_speed;
161 this.origin_y += this.velocity_y * think_speed;
179 this.velocity_y *= -1;
187 this.velocity_y *= -1;
196 this.velocity_x *= -1;
204 this.velocity_x *= -1;
218 float min_distance = 1;
222 if ( mayball.classname ==
"pong_ball" )
224 distance =
vlen(mayball.origin-
this.pong_ai_paddle.origin);
225 next_distance =
vlen(mayball.origin+mayball.velocity-
this.pong_ai_paddle.origin);
226 if ( distance < min_distance && ( distance < 0.5 || next_distance < distance ) )
228 min_distance = distance;
237 if ( this.
team <= 2 )
240 target = ball.origin_y + ball.velocity_y*think_speed;
246 target = ball.origin_x + ball.velocity_x*think_speed;
253 if (
target < my_pos - distance)
255 else if (
target > my_pos + distance)
264 ai.minigame_players = ai;
265 ai.team = paddle.team;
268 ai.pong_ai_paddle = paddle;
270 paddle.realowner = ai;
291 this.origin_x =
bound(halflen, this.origin_x+pmovement, 1-halflen);
293 this.origin_y =
bound(halflen, this.origin_y+pmovement, 1-halflen);
302 return vec2(length/2, width/2);
303 return vec2(width/2, length/2);
310 case 1:
return '0.99 0.5 0';
311 case 2:
return '0.01 0.5 0';
312 case 3:
return '0.5 0.01 0';
313 case 4:
return '0.5 0.99 0';
314 default:
return '0 0 0';
326 paddle.nextthink =
time;
327 paddle.team = pl_team;
331 if ( real_player ==
NULL )
334 paddle.realowner = real_player;
336 minigame.pong_paddles[pl_team-1] = paddle;
362 if ( minigame.pong_paddles[i] ==
NULL )
379 paddle = minigame.pong_paddles[i];
380 if ( paddle !=
NULL && paddle.realowner == player )
383 ai.pong_score = player.minigame_players.pong_score;
410 ball.m_mins =
vec2(-ball.pong_length, -ball.pong_length);
411 ball.m_maxs =
vec2(ball.pong_length, ball.pong_length);
453 if ( minigame.pong_paddles[j] ==
NULL )
459 sprint(player.minigame_players,
"Cannot spawn AI\n");
471 paddle = minigame.pong_paddles[j];
472 if ( paddle !=
NULL &&
473 paddle.realowner.classname ==
"pong_ai" )
475 minigame.pong_paddles[j] =
NULL;
476 delete(paddle.realowner);
482 sprint(player.minigame_players,
"Cannot remove AI\n");
508float pong_team_to_angle(
int nteam)
515 case 3:
return M_PI*3/2;
516 case 4:
return M_PI/2;
520vector pong_team_to_color(
int nteam)
524 case 1:
return '1 0 0';
525 case 2:
return '0 0 1';
526 case 3:
return '1 1 0';
527 case 4:
return '1 0 1';
528 default:
return '1 1 1';
532int pong_keys_pressed;
533int pong_keys_pressed_old;
538 if(pong_keys_pressed != pong_keys_pressed_old)
540 pong_keys_pressed_old = pong_keys_pressed;
550 if ( e.classname ==
"pong_ball" )
560 obj_size, pong_team_to_color(e.team),
563 else if ( e.classname ==
"pong_paddle" )
569 obj_size, obj_size/2, pong_team_to_color(e.team),
573 obj_size, obj_size/2,
'1 1 1',
589 ts_y += hud_fontsize_y;
601 if ( (e.classname ==
"minigame_player" || e.classname ==
"pong_ai") && e.team !=
PONG_SPECTATOR_TEAM )
604 mypos_y += (e.team-1) * (player_fontsize_y + ts_y);
609 (e.minigame_playerslot ?
entcs_GetName(e.minigame_playerslot-1) : _(
"AI")),
622string pong_message(
int mgflags)
624 string rmessage =
"";
626 rmessage = _(
"You are spectating");
628 rmessage = _(
"Press ^1Start Match^7 to start the match with the current players");
633int pong_client_event(
entity minigame,
string event, ...)
647 switch ( ...(0,
int) )
653 if (event ==
"key_pressed")
668 if (event ==
"key_pressed")
681 case "network_receive":
687 sent.pong_score = ReadLong();
689 else if ( sent.classname ==
"minigame" )
693 strcpy(sent.message, pong_message(sent.minigame_flags));
712 else if (
cmd ==
"pong_aimore" ||
cmd ==
"pong_ailess" )
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
void minigame_drawcolorcodedstring_trunc(float maxwidth, vector pos, string text, vector fontsize, float theAlpha, int drawflags)
void minigame_show_allspecs(vector boardpos, vector boardsize)
vector minigame_drawstring_wrapped(float maxwidth, vector pos, string text, vector fontsize, vector color, float theAlpha, int drawflags, float align)
void minigame_hud_simpleboard(vector pos, vector mySize, string board_texture)
string minigame_texture(string name)
vector minigame_hud_denormalize_size(vector v, vector pos, vector mySize)
vector minigame_hud_denormalize(vector v, vector pos, vector mySize)
void minigame_drawpic_centered(vector pos, string texture, vector sz, vector color, float thealpha, int drawflags)
#define REGISTER_MINIGAME(name, nicename)
#define minigame_hud_fitsqare(pos, mySize)
#define minigame_cmd(...)
#define FOREACH_MINIGAME_ENTITY(entityvar)
void HUD_MinigameMenu_CustomEntry(entity parent, string menumessage, string event_arg)
void drawborderlines(float thickness, vector pos, vector dim, vector color, float theAlpha, float drawflag)
#define drawstring(position, text, scale, rgb, alpha, flag)
#define drawfill(position, size, rgb, alpha, flag)
const float DRAWFLAG_NORMAL
const float DRAWFLAG_ADDITIVE
string entcs_GetName(int i)
#define HUD_Panel_DrawBg()
entity msle_spawn(entity minigame_session, entity e)
const int MINIG_SF_UPDATE
const int MINIG_SF_CUSTOM
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
bool pong_goal(entity ball, int pteam)
const int PONG_SF_BALLTEAM
float autocvar_sv_minigames_pong_paddle_speed
void pong_add_score(entity minigame, int team_thrower, int team_receiver, int delta)
float autocvar_sv_minigames_pong_ball_number
vector box_nearest(vector box_min, vector box_max, vector p)
float autocvar_sv_minigames_pong_ball_wait
void pong_ball_think(entity this)
const int PONG_SF_PLAYERSCORE
float autocvar_sv_minigames_pong_ball_radius
int pong_server_event(entity minigame, string event,...)
const int PONG_STATUS_PLAY
void pong_ball_throwthink(entity this)
const int PONG_KEY_INCREASE
entity pong_paddle_spawn(entity minigame, int pl_team, entity real_player)
float autocvar_sv_minigames_pong_ball_speed
entity pong_ai_spawn(entity paddle)
const int PONG_SPECTATOR_TEAM
float autocvar_sv_minigames_pong_ai_thinkspeed
const int PONG_STATUS_WAIT
const int PONG_MAX_PLAYERS
void pong_ball_reset(entity ball)
vector pong_team_to_paddlepos(int nteam)
float autocvar_sv_minigames_pong_paddle_size
void pong_paddle_think(entity this)
void pong_ball_throw(entity ball)
void pong_ai_think(entity this)
const int PONG_KEY_DECREASE
bool pong_paddle_hit(entity ball, int pteam)
void pong_paddle_bounce(entity ball, int pteam)
float autocvar_sv_minigames_pong_ai_tolerance
entity pong_paddles[PONG_MAX_PLAYERS]
vector pong_team_to_box_halfsize(int nteam, float length, float width)
float autocvar_sys_ticrate
void SUB_NullThink(entity this)
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
ERASEABLE float boxesoverlap(vector m1, vector m2, vector m3, vector m4)
requires that m2>m1 in all coordinates, and that m4>m3
void drawrotpic(vector org, float rot, string pic, vector sz, vector hotspot, vector rgb, float a, float f)