From 89b0979ff5aca4180059a0b91f3709cc9e24b882 Mon Sep 17 00:00:00 2001 From: mrbougo Date: Mon, 15 Jun 2009 19:32:06 +0000 Subject: [PATCH] nexball changes: tweak bounciness using the new DP extension, add waypoint sprites, and radar support git-svn-id: svn://svn.icculus.org/nexuiz/trunk@7044 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/defaultNexuiz.cfg | 4 + data/models/sprites/make-sprites.sh | 1 + data/models/sprites/nb-ball.png | Bin 0 -> 2679 bytes data/models/sprites/nb-ball.sp2 | Bin 0 -> 65592 bytes data/models/sprites/nb-ball.svg | 85 +++++++++++++++++++++ data/models/sprites/nb-ball.tga | Bin 0 -> 65554 bytes data/qcsrc/server/nexball.qc | 112 ++++++++++++++++------------ 7 files changed, 154 insertions(+), 48 deletions(-) create mode 100644 data/models/sprites/nb-ball.png create mode 100644 data/models/sprites/nb-ball.sp2 create mode 100644 data/models/sprites/nb-ball.svg create mode 100644 data/models/sprites/nb-ball.tga diff --git a/data/defaultNexuiz.cfg b/data/defaultNexuiz.cfg index 2f672d78b..d76b32885 100644 --- a/data/defaultNexuiz.cfg +++ b/data/defaultNexuiz.cfg @@ -689,6 +689,10 @@ set g_balance_nexball_secondary_animtime 0.3 "stealing projectile animtime" // The 1st Rev boost is always horizontal // The 2nd Rev boost is always vertical set g_nexball_football_physics 2 "0: Revenant's original movement, 1: 0 but half independant of aiming height, 2: 1 fully independant, -1: first recode try" +set g_nexball_basketball_bouncefactor 0.6 "velocity loss when the ball bounces" +set g_nexball_basketball_bouncestop 0.075 "speed at which the ball stops when it hits the ground (multiplied by sv_gravity)" +set g_nexball_football_bouncefactor 0.6 "velocity loss when the ball bounces" +set g_nexball_football_bouncestop 0.075 "speed at which the ball stops when it hits the ground (multiplied by sv_gravity)" set g_nexball_football_boost_forward 100 "forward velocity boost when the ball is touched" set g_nexball_football_boost_up 200 "vertical velocity boost when the ball is touched" diff --git a/data/models/sprites/make-sprites.sh b/data/models/sprites/make-sprites.sh index 8c0c57ba6..09cb0cc83 100644 --- a/data/models/sprites/make-sprites.sh +++ b/data/models/sprites/make-sprites.sh @@ -169,6 +169,7 @@ sprite ons-cp-dfnd-red "CONTROL POINT" ff0000 000000 0.5 ff0000 ffffff 0.5 sprite ons-cp-dfnd-blue "CONTROL POINT" 0000ff 000000 0.5 0000ff ffffff 0.5 sprite race-checkpoint "CHECKPOINT" ff8000 000000 0.0 sprite race-finish "FINISH" ff8000 000000 0.0 +sprite nb-ball "BALL" e8d8a0 000000 0.0 sprite wpn-laser "LASER" ff8080 000000 0.0 # bright red sprite wpn-shotgun "SG" 804000 000000 0.0 # brown diff --git a/data/models/sprites/nb-ball.png b/data/models/sprites/nb-ball.png new file mode 100644 index 0000000000000000000000000000000000000000..5d36bf83dd3981976613370f52b2f15b4a79c9c9 GIT binary patch literal 2679 zcmbtW`8yQc7r$f77+dHiVVJa7A_+4gO16kL*|SxQL5vzTB1TzyHC`s(WGoF$k~ceJ z44RoHSyGk|*&=xfgDjEtJAHrn{sZ6pJoj_X{XEY(=bq<0&*$F6^Jh;Z~ zEFA!V2wY%>fD3Thvyd$?!US_$M}%PALHPbDIE#kbxDfz=&-~sHm79iW0jUsXqCa+7(_g~pc%mp0E zuu@TRuruR%w0_LS@wK&B4c7e7@VKPfV!pA(*uW+qK|^ILyq0=D>FHIhKU?lvMB?L* z`Ob&d4?*BRNMj7Eme#HUR&mGRH7g4`Of5};0Z$uSEzH92+T~LC@@9gRyL*58iog0b zOyp?4oPHW<;my*VFqgW>45p&CBhS1lzg|#)F+|dGQTVgxylQa|DvNBK{_?&PT2|H8 z(MJmbU{w|JF^A*z*hKTlJGWb^6UT4O81tB}MVle_B~-*>CYsxcvgQ^-Lm^U!LH_rwFR6B=yLGv-Q3_HO zG4s;9oehVrtuTTf-xJ!5tQwm;I#t-O8vCYcK-s6F@zjT!8+7ik+vilKx8Al?<7AcqmXMs;6R~e?zhJ%k-x#vLUHfOoY zbx8h)4YmS}yK~kSw0;VcN#&es?%=N+HvCzJ$(~Rh#e0L6`$bt6I~r33-1EGk1SF< z=DV5)cDp|Vm~*Ec5pQ`NDoP2XwYPJg+q7jG{NcBAA)6Lq!OMdm2+TwmQ}vV@c@ z@RCI-C6e7p(yRe5Jg$MgZ$c@>&$IpI$L`=C9o>VsEC1LRe$w;t6uae6!rPCTk|Ph< zZDHRQ7$RM=dJhkSGFR;)udRFgIX0UgEz*9`A;&GSaR(?mK9Y{;&5@@2pFK<+K?xrF7`&P*Spyc&X}{_Nc7$ZgTI^&}3U zsh2{>t=SMRBl+or+FENT+d^j*r9&|AXMCQGL$X}qyC8?Uo_&IOj##bL!e>?|Ta`Zi zn|>8=M=PL0(2d6X_ZOd&Qh!DGR+&qHjK5{$`Ew=I`K@G&fhu(4(ORaA^hnl^kExC_ zSwm=Q-SwAF(j-Cpq3PLaGOp+g`sL zFOxYWPgq#!p?9KP)2=*ixN7XOa?CHpdoGI=^{T#fQ+Rd#O6OqWz0``#UzjXD2O5R+ zoupfF^E9)Y#C>jZ^5uc6_AaHE#Q?>Jd%lf7vh$`KZ%t0uwh?{wS6-x0#se(y!ZHUw zPu3oKEN-^FfMW2k+zo>2*M(VDv9**l} zM!RE~pT$QKhGr?z^@OfxRfX39K%sUyW1l68*;Tb>W@?9cf0U7FdozH?zE6Nw4)&CP z<_px}+HF?tr(j^2A~(jIdsPA9!ihH(?XepZ4LyXn`Dj@Xn--aULg@drED(WCfz;lU8W^@-@0cl6pg}W6tB;zP_J5HdUhzok9^0<_D5ji@^`tYM zOhu~Tx^axEs;^5dkEV3mX7N;X^!Sc2&rse9TEF*SXibcnrT^Hy433Kq0q@H%+_xud;wMSnMnibh*kdTp2GKRt~P)}>bd z6O*ov>n`@!dNlxqv)BdCcx#e`nAR}SiLN;-NZG?DaEuKZ<(UF83osxz@BMMj@|!W zbo1IgD>E#$@5hgCXPfTp0#CSadg3LF&R}U0aWnh8*X090Rn{W(HNfszp_t2m|F}_K z8~D66n1+gM%Te_@MHJe}^N|H{y1QXORl*u#hKRiYr2h|U$vXF8EYt@LNK!Y~7Q4Ko zdII2~vSyJd)~ynBBQz(QQw?;iBf?(Ke9O4rN%wRR;M_G%Y*6B6*Z zgs2K>mMUS#U@SjxWf2_-1sdg!NEM41_zBhblo$3CIbT|H*rb@0VOYEf^0T_0 z@;hNSNQ@<(m@KWgn*BSAH1@QkTC*5#{tupqtul&tep{sXI;n?F3wINI5`nGNS<4c0 HpL_oSVBPwG literal 0 HcmV?d00001 diff --git a/data/models/sprites/nb-ball.sp2 b/data/models/sprites/nb-ball.sp2 new file mode 100644 index 0000000000000000000000000000000000000000..bcc3758e84831949c3ef2460489e492a1cfae254 GIT binary patch literal 65592 zcmeI5eQ*@z9mh`+;D(UUBqW!+3zu9jm*gNOKxl##1|eG6nMV_se8&o;`Q(_AdD& zxAWbZC;Qw!zvuTn&*z!%v%AkeyQ#YVwwtpp7Rz7?7xyKVTduNLuBABbRNE>c#8f`g zo32X44-fzW5C8!X009sH0T2KI5C8!X009sHfv5?@#l_9`=GZ&*gQGpq<7o4G94~sZ zY&%m^lOCYLN+<+R;e@Nh2zy5I>ssZwGDp5mnMa3nKy|Ir%Ab~+)Eq9aoSvMV)TrfW z*s!5XWIMz`!0ZG_Q?-vhJWqV^_BP$n{@NyS=%q&S!rmW>9Zie7tEW%s@?_iEtk(E) zqkO2GS@$fQ@ei$Xn%2}_9+{G~GMulWLkBO~_{e-!JzxCk3gPuQpAVN;PS45C*!|3| z@2mVg{-e8vEv;v4lT8r^0aFuT{cm1(r?~LJo`}Nht&fV5;@mR?XS@+Wq`CdS`T4_| zWgI`UMdaq#-y=UmLiu9-Z`-g?<>S>C9*Ii-FF*5u%1_JIdgwnCe59F@fR_GG{{9K^ z+@9ruz#2REr`;;O@Obgs%ZwlWAPoc}C!nSOUR}3mxon#`$sOq){FNu}n7Dmf`B;awsm8W`0g~ zRYA7$&p{q{#?f~VZ3^hU>;0$1Tmhy zkRfq*==p;F^~m5j2t-G~p#B}?z4o>l*PNGi%<+or#-5|JBE8b>wvU z&DRXercN$AD<9{1hMa8Muk?ID|9WI_90Z~xpr`)=uk!-U?R9b(U!3#teM@G3@#Zhr zs?PmSKYq^@x@SKSqU3~pkMqM*N1q7fQ_vx1)8v?&SLh`FX)df7mYaz0MP4Z&hmT&2b!jWB(eJ-&9t8S_fR_IG`9Iy)9~qgP*uWtp{c8_-vNQITmUz3`4y;pYb?^3j zyB+qFox!!Cwe$;D-+#w{&`eMYn639v#PX{(tJ{Vif@=Uwo5+u zM;foc>&CxR-ENV5LjN)h#6h4R2t=rV$GD=LkAt;*^Eb=7s4B%ub!=%P8n zlHWYH;Lf(G)*#~gUm=V=2=osDJ^j;~-Bv1r*Wz-pQ5Z}2`9IsR+OK+E$JYYByixof zU;+i+tX_}(IKSsB>%Hxjb>eXAnvj9-C6qkucfz>bPV(nsr@ZOu-|0wwm6B(N3AeKk z-uV6B;O7$j{$FB(wS|(y`Kj!2fn4=XE|4zn*`d&-EP2O7hOo8s4tmTb5o4 zzV_$2LekS=2}Q;H+1G!j=$Q9^e6v{;Js(F|6!rGNJm)x#&o=@o6wDiwolU{!1IIVTQl;^RBTJNM3fjtPs z1OYAm%Nh(7|L~n{Vse@96Kd!rrLkGA^u5nNy(dU3w4pm!K~&0)``rGLG=@^QX~$ZH@2!q4&LIe&|F z@Zh<0pYWyZi{=Xit?_w_Y{PypkiG->KRyXD;(>B;N4y?p*(=)XagE|;Yj zr!~c2IsgBl{?>^7Jhc2fIRA4;U^5eeanu;Ufxyq=rchwbtDei#Z)M}TF~3HbtQdsZ z^EW{K8bO)6<8O^=r5ia`LwS|0oFe`x!wkg<_8lmwuEQ+6vF1pvm?!3YFQNdWpcWw)YHAYh09^lu0gj6lGY z1fYLYb}JeM0)_}c|AsKZ2n0+?0Qxs&x1v!XV2A+pZwM2NK){p)pnp?#D;fm?h6q6a zhA_bh1WZW)`Zr~_qER4Vi6;j9|2zC4LbHMI|1^il&%U_~E(;q7fWW{aP?VSJIJLO8 zO7r`Eto?((Sgrg0FHU0{t-wCnH#N6tU^N-F0Ra$@2wYw0bDcQ!QlqZUE zNo8Cum4hefZ;I!+K-J6MJ+)fLIPpO0BAo#qA&-6*dm}i20;6<)sd(z2t-NX zD`Nn(A0 + + + + + + + + image/svg+xml + + + + + + + BALL + + diff --git a/data/models/sprites/nb-ball.tga b/data/models/sprites/nb-ball.tga new file mode 100644 index 0000000000000000000000000000000000000000..5336c2f4fdfe9601efba341885e2a86d9c5a0845 GIT binary patch literal 65554 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 literal 0 HcmV?d00001 diff --git a/data/qcsrc/server/nexball.qc b/data/qcsrc/server/nexball.qc index ef3f32843..ab36850a0 100644 --- a/data/qcsrc/server/nexball.qc +++ b/data/qcsrc/server/nexball.qc @@ -3,6 +3,7 @@ #define BALL_MINS '-16 -16 -16' // The model is 24*24*24 #define BALL_MAXS '16 16 16' #define BALL_ATTACHORG '3 0 16' +#define BALL_SPRITECOLOR '.91 .85 .62' #define BALL_FOOT 1 #define BALL_BASKET 2 //spawnflags @@ -114,11 +115,55 @@ void DropOwner (void) ownr.flags &~= FL_ONGROUND; } +void GiveBall (entity plyr, entity ball) +{ + local entity ownr; + + if ((ownr = ball.owner)) + { + ownr.effects &~= g_nexball_basketball_effects_default; + ownr.ballcarried = world; + if (ownr.metertime) + { + ownr.metertime = 0; + ownr.weaponentity.state = WS_READY; + } + } + + setattachment(ball, plyr, ""); + setorigin(ball, BALL_ATTACHORG); + + if (ball.team != plyr.team) + ball.teamtime = time + g_nexball_basketball_delay_hold_forteam; + + ball.owner = ball.pusher = plyr; //"owner" is set to the player carrying, "pusher" to the last player who touched it + ball.team = plyr.team; + plyr.ballcarried = ball; + ball.dropperid = plyr.playerid; + + plyr.effects |= g_nexball_basketball_effects_default; + ball.effects &~= g_nexball_basketball_effects_default; + + ball.velocity = '0 0 0'; + ball.movetype = MOVETYPE_NONE; + ball.touch = SUB_Null; + ball.effects |= EF_NOSHADOW; + ball.scale = 1; // scale down. + + ball.waypointsprite_attachedforcarrier.exteriormodeltoclient = plyr; + + if (g_nexball_basketball_delay_hold) + { + ball.think = DropOwner; + ball.nextthink = time + g_nexball_basketball_delay_hold; + } +} + void DropBall (entity ball, vector org, vector vel) { ball.effects |= g_nexball_basketball_effects_default; ball.effects &~= EF_NOSHADOW; - ball.owner.effects &~= g_nexball_basketball_effects_default; // this may be problematic. + ball.owner.effects &~= g_nexball_basketball_effects_default; setattachment(ball, world, ""); setorigin (ball, org); @@ -137,6 +182,8 @@ void DropBall (entity ball, vector org, vector vel) ball.owner.weaponentity.state = WS_READY; } + ball.waypointsprite_attachedforcarrier.exteriormodeltoclient = world; + ball.owner.ballcarried = world; ball.owner = world; } @@ -157,6 +204,7 @@ void InitBall (void) self.pusher = world; self.team = FALSE; sound (self, CHAN_PROJECTILE, self.noise1, VOL_BASE, ATTN_NORM); + WaypointSprite_Ping(self.waypointsprite_attachedforcarrier); LogNB("init", world); } @@ -239,28 +287,7 @@ void basketball_touch (void) if (other.health <= 0) return; LogNB("caught", other); - - if (self.team != other.team) - self.teamtime = time + g_nexball_basketball_delay_hold_forteam; - - self.owner = self.pusher = other; //"owner" is set to the player carrying, "pusher" to the last player who touched it - self.team = other.team; - other.ballcarried = self; - other.effects = other.effects | g_nexball_basketball_effects_default; - self.effects &~= g_nexball_basketball_effects_default; - self.effects |= EF_NOSHADOW; - self.scale = 1; // scale down. - self.dropperid = other.playerid; - setattachment(self, other, ""); - setorigin(self, BALL_ATTACHORG); - self.velocity = '0 0 0'; - self.movetype = MOVETYPE_NONE; - self.touch = SUB_Null; - if (g_nexball_basketball_delay_hold) - { - self.think = DropOwner; - self.nextthink = time + g_nexball_basketball_delay_hold; - } + GiveBall(other, self); } else if (other.solid == SOLID_BSP) { sound (self, CHAN_PROJECTILE, self.noise, VOL_BASE, ATTN_NORM); if (vlen(self.velocity) && !self.cnt) @@ -325,6 +352,9 @@ void GoalTouch (void) if (ball.owner) // Happens on spawnflag GOAL_TOUCHPLAYER DropBall(ball, ball.owner.origin, ball.owner.velocity); + + WaypointSprite_Ping(ball.waypointsprite_attachedforcarrier); + ball.cnt = 1; ball.think = ResetBall; if (ball.classname == "nexball_basketball") @@ -384,6 +414,8 @@ void SpawnBall (void) { if(!g_nexball) { remove(self); return; } +// balls += 4; // using the remaining bits to count balls will leave more than the max edict count, so it's fine + if (!self.model) { self.model = "models/nexball/ball.md3"; self.scale = 1.3; @@ -422,6 +454,9 @@ void SpawnBall (void) precache_sound (self.noise1); precache_sound (self.noise2); + WaypointSprite_AttachCarrier("nb-ball", self); // the ball's team is not set yet, no rule update needed + WaypointSprite_UpdateTeamRadar(self.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); + self.reset = ball_restart; self.think = InitBall; self.nextthink = game_starttime + cvar("g_nexball_delay_start"); @@ -442,6 +477,8 @@ void spawnfunc_nexball_basketball (void) self.effects = g_nexball_basketball_effects_default; self.solid = SOLID_TRIGGER; balls |= BALL_BASKET; + self.bouncefactor = cvar("g_nexball_basketball_bouncefactor"); + self.bouncestop = cvar("g_nexball_basketball_bouncestop"); SpawnBall(); } @@ -450,6 +487,8 @@ void spawnfunc_nexball_football (void) self.classname = "nexball_football"; self.solid = SOLID_TRIGGER; balls |= BALL_FOOT; + self.bouncefactor = cvar("g_nexball_football_bouncefactor"); + self.bouncestop = cvar("g_nexball_football_bouncestop"); SpawnBall(); } @@ -531,31 +570,6 @@ void W_Nexball_Touch (void) other.flags &~= FL_ONGROUND; if(!attacker.ballcarried) { - other.effects &~= g_nexball_basketball_effects_default; - other.ballcarried = world; - - if (g_nexball_basketball_delay_hold) - { - ball.think = DropOwner; - ball.nextthink = time + g_nexball_basketball_delay_hold; - } - - attacker.effects = attacker.effects | g_nexball_basketball_effects_default; - attacker.ballcarried = ball; - if (other.metertime) - { - other.metertime = 0; - other.weaponentity.state = WS_READY; - } - - setattachment(ball, attacker, ""); - ball.owner = ball.pusher = attacker; - ball.team = attacker.team; - ball.dropperid = attacker.playerid; - - if (other.team != attacker.team) - ball.teamtime = time + g_nexball_basketball_delay_hold_forteam; - LogNB("stole", attacker); sound (other, CHAN_AUTO, ball.noise2, VOL_BASE, ATTN_NORM); @@ -565,6 +579,8 @@ void W_Nexball_Touch (void) attacker.teamkill_soundtime = time + 0.4; attacker.teamkill_soundsource = other; } + + GiveBall(attacker, other.ballcarried); } } remove(self); -- 2.39.2