00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 void snap_nav_constructor();
00032 void snap_nav_main();
00033
00034 void snap_nav_struct_main();
00035 float snap_nav_struct_detect(float dir, vector v_start, vector v_out, vector v_out_up);
00036 void snap_nav_struct_soundout(float dir, float objtype);
00037
00038 void snap_nav_haz_main();
00039 float snap_nav_haz_detect(float fwd, vector v_start, vector v_dir, float reverse, float snd);
00040
00041 float snap_nav_z_main();
00042
00043 void snap_nav_corners_main();
00044 float snap_nav_corners_check(vector v_cmid, vector v_coff);
00045
00046
00047
00048
00049
00050
00058 void snap_nav_constructor()
00059 {
00060 local entity new_agnav, child_drop;
00061
00062
00063 new_agnav = spawn();
00064
00065
00066 new_agnav.movetype = MOVETYPE_NONE;
00067 new_agnav.solid = SOLID_NOT;
00068
00069
00070
00071
00072
00073 new_agnav.health = 0.5;
00074
00075
00076 new_agnav.frags = stof(infokey(self, "agv_nav_detrange"));
00077
00078
00079
00080 new_agnav.ammo_rockets = stof(infokey(self, "agv_nav_wall_volume_throttle"));
00081 if( new_agnav.ammo_rockets > 1 || new_agnav.ammo_rockets < 0 )
00082 new_agnav.ammo_rockets = 1;
00083
00084
00085 new_agnav.ammo_shells = stof(infokey(self, "agv_nav_wall_touch_volume_throttle"));
00086 if( new_agnav.ammo_shells > 1 || new_agnav.ammo_shells < 0 )
00087 new_agnav.ammo_shells = 1;
00088
00089
00090 new_agnav.skin = stof(infokey(self, "agv_nav_haz_volume_throttle"));
00091 if( new_agnav.skin > 1 || new_agnav.skin < 0 )
00092 new_agnav.skin = 1;
00093
00094
00095 new_agnav.lip = stof(infokey(self, "agv_nav_corner_volume_throttle"));
00096 if( new_agnav.lip > 1 || new_agnav.lip < 0 )
00097 new_agnav.lip = 1;
00098
00099
00100 new_agnav.owner = self;
00101 self.agrip_nav = new_agnav;
00102
00103
00104 child_drop = spawn();
00105 child_drop.movetype = MOVETYPE_NONE;
00106 child_drop.solid = SOLID_NOT;
00107 setmodel(child_drop, "progs/s_bubble.spr");
00108 child_drop.classname = "agrip_hazard";
00109 child_drop.owner = self.agrip_nav;
00110 self.agrip_nav.aiment = child_drop;
00111 self.agrip_nav.view_ofs = '0 0 0';
00112
00113
00114 new_agnav.wait = time;
00115
00116
00117 self.count = 0;
00118 self.state = 0;
00119
00120
00121 new_agnav.think = snap_nav_main;
00122 new_agnav.nextthink = time + 0.1;
00123 };
00124
00128 void snap_nav_main()
00129 {
00130 local float z_changed;
00131
00132
00133 snap_nav_struct_main();
00134
00135
00136 z_changed = snap_nav_z_main();
00137
00138
00139
00140 if( z_changed != true )
00141 if( infokey(self.owner, "agv_t_nav_haz_warnings") == "1" )
00142 snap_nav_haz_main();
00143
00144
00145 snap_nav_corners_main();
00146
00147
00148 self.nextthink = time + self.health;
00149 };
00150
00151
00152
00153
00159 void snap_nav_struct_main()
00160 {
00161
00162 local vector v_start,
00163 v_nav_fwd, v_nav_fwd_up,
00164 v_nav_lft, v_nav_lft_up,
00165 v_nav_rgt, v_nav_rgt_up,
00166 v_nav_bck, v_nav_bck_up;
00167
00168
00169 local float objtype;
00170
00171
00172
00173 v_start = self.owner.origin - '0 0 20';
00174
00175
00176
00177 makevectors(self.owner.angles);
00178
00179 v_nav_fwd = v_start + self.frags * v_forward;
00180 v_nav_fwd_up = v_nav_fwd + ( 50 * v_up );
00181
00182 v_nav_lft = v_start - self.frags * v_right;
00183 v_nav_lft_up = v_nav_lft + ( 50 * v_up );
00184
00185 v_nav_rgt = v_start + self.frags * v_right;
00186 v_nav_rgt_up = v_nav_rgt + ( 50 * v_up );
00187
00188 v_nav_bck = v_start - self.frags * v_forward;
00189 v_nav_bck_up = v_nav_bck + ( 50 * v_up );
00190
00191
00192
00193
00194 objtype = snap_nav_struct_detect(SNAP_NAV_DIR_FWD, v_start, v_nav_fwd, v_nav_fwd_up);
00195 snap_nav_struct_soundout(SNAP_NAV_DIR_FWD, objtype);
00196
00197 objtype = snap_nav_struct_detect(SNAP_NAV_DIR_BCK, v_start, v_nav_bck, v_nav_bck_up);
00198 snap_nav_struct_soundout(SNAP_NAV_DIR_BCK, objtype);
00199
00200
00201
00202 objtype = snap_nav_struct_detect(SNAP_NAV_DIR_LFT, v_start, v_nav_lft, v_nav_lft_up);
00203 snap_nav_struct_soundout(SNAP_NAV_DIR_LFT, objtype);
00204
00205 objtype = snap_nav_struct_detect(SNAP_NAV_DIR_RGT, v_start, v_nav_rgt, v_nav_rgt_up);
00206 snap_nav_struct_soundout(SNAP_NAV_DIR_RGT, objtype);
00207
00208 };
00209
00219 float snap_nav_struct_detect(float dir, vector v_start, vector v_out, vector v_out_up)
00220 {
00221 local float Xout, Xoutup, Yout, Youtup;
00222 local float tracedown_half_out, tracedown_quarter_out, tracedown_nearplr_out;
00223 local vector v_test;
00224
00225
00226
00227
00228 traceline(v_start + '0 0 15', v_out_up, true, self.owner);
00229
00230 Xoutup = trace_endpos_x;
00231 Youtup = trace_endpos_y;
00232
00233
00234 if( trace_fraction != 1 )
00235 {
00236 if( trace_ent.classname == "door" )
00237 {
00238 self.volume = 1 - trace_fraction;
00239 return SNAP_NAV_STRUCT_DOOR;
00240 }
00241 }
00242
00243
00244
00245
00246 if( self.owner.agrip_aux.ammo_nails & dir )
00247 {
00248 self.volume = 1 - trace_fraction;
00249 return SNAP_NAV_STRUCT_WALL;
00250 }
00251
00252
00253 traceline(v_start, v_out, true, self.owner);
00254
00255 Xout = trace_endpos_x;
00256 Yout = trace_endpos_y;
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272 self.volume = 1 - trace_fraction;
00273
00274
00275
00276 if( (Xout != Xoutup && Yout == Youtup )
00277 || (Yout != Youtup && Xout == Xoutup ) )
00278 {
00279 return SNAP_NAV_STRUCT_SLOPE;
00280 }
00281 else if( trace_fraction < 0.5
00282 && Xout == Xoutup && Yout == Youtup )
00283 {
00284
00285 return SNAP_NAV_STRUCT_WALL;
00286 }
00287 else
00288
00289
00290
00291 {
00292
00293 v_out = v_out - v_start;
00294 v_out = v_out * 0.5;
00295 v_out = v_start + v_out;
00296 traceline(v_out, v_out - '0 0 100', true, self);
00297
00298 tracedown_half_out = trace_fraction;
00299
00300
00301 v_out = v_out - v_start;
00302 v_out = v_out * 0.5;
00303 v_out = v_start + v_out;
00304 traceline(v_out, v_out - '0 0 100', true, self);
00305
00306 tracedown_quarter_out = trace_fraction;
00307
00308
00309 if( trace_fraction == 1 )
00310 return;
00311
00312
00313 v_out = normalize(v_out - v_start);
00314 v_out = v_start + 20*v_out;
00315 traceline(v_out, v_out - '0 0 100', true, self);
00316
00317 tracedown_nearplr_out = trace_fraction;
00318
00319
00320 if( trace_fraction == 1 )
00321 return;
00322
00323
00324
00325
00326
00327
00328
00329 if( fabs(tracedown_half_out - tracedown_quarter_out) < 0.05 )
00330 tracedown_half_out = tracedown_quarter_out;
00331 if( fabs(tracedown_nearplr_out - tracedown_quarter_out) < 0.05 )
00332 tracedown_nearplr_out = tracedown_quarter_out;
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345 if( ( (tracedown_nearplr_out < tracedown_quarter_out)
00346 && (tracedown_quarter_out < tracedown_half_out) )
00347 || ( (tracedown_nearplr_out == tracedown_quarter_out)
00348 && (tracedown_quarter_out < tracedown_half_out) )
00349 || ( (tracedown_nearplr_out < tracedown_quarter_out)
00350 && (tracedown_quarter_out == tracedown_half_out) ) )
00351 {
00352 self.volume = 1 - ( vlen(trace_endpos - v_start) / self.frags );
00353 return SNAP_NAV_STRUCT_SLOPE_DOWN;
00354 }
00355 }
00356 };
00357
00368 void snap_nav_struct_soundout(float direction, float objtype)
00369 {
00370 local float actual_sound_level;
00371
00372
00373 setorigin(self, trace_endpos);
00374
00375
00376
00377
00378
00379
00380
00381
00382 if( objtype == SNAP_NAV_STRUCT_WALL )
00383 {
00384
00385
00386
00387
00388 if( self.owner.agrip_aux.ammo_shells & direction )
00389 {
00390
00391 actual_sound_level = 1;
00392 safe_soundtoclient(self.owner, self, CHAN_AUTO, "player/land.wav", actual_sound_level, ATTN_NORM);
00393 self.owner.agrip_aux.ammo_shells = self.owner.agrip_aux.ammo_shells - (self.owner.agrip_aux.ammo_shells & direction);
00394 }
00395
00396 else if( self.owner.agrip_aux.ammo_nails & direction )
00397 {
00398
00399 if( infokey(self.owner, "agv_t_nav_wall_touch_warnings") == "1" )
00400 {
00401
00402 actual_sound_level = 1 * self.ammo_shells;
00403
00404
00405 if( direction != SNAP_NAV_DIR_FWD )
00406 actual_sound_level = actual_sound_level * 0.5;
00407
00408
00409
00410 safe_soundtoclient(self.owner, self, CHAN_AUTO, "misc/menu3.wav", actual_sound_level, ATTN_NORM);
00411 }
00412 }
00413
00414 else if( trace_fraction < 0.5 )
00415 {
00416
00417
00418 actual_sound_level = self.volume * self.ammo_rockets;
00419
00420
00421 if( infokey(self.owner, "agv_t_nav_wall_warnings") == "1"
00422 && direction != SNAP_NAV_DIR_BCK
00423 && (
00424 infokey(self.owner, "agv_t_nav_side_wall_warnings") == "1"
00425 || (
00426 direction != SNAP_NAV_DIR_LFT
00427 && direction != SNAP_NAV_DIR_RGT
00428 )
00429 )
00430 )
00431 safe_soundtoclient(self.owner, self, CHAN_AUTO, "nav/wall.wav", actual_sound_level, ATTN_NORM);
00432 }
00433
00434 }
00435 else
00436 {
00437
00438
00439
00440
00441
00442 if( direction != SNAP_NAV_DIR_BCK )
00443 {
00444
00445 actual_sound_level = self.volume;
00446
00447
00448
00449 if( objtype == SNAP_NAV_STRUCT_SLOPE )
00450 {
00451 safe_soundtoclient(self.owner, self, CHAN_AUTO, "nav/slope.wav", actual_sound_level, ATTN_NORM);
00452 }
00453 else if( objtype == SNAP_NAV_STRUCT_SLOPE_DOWN )
00454 {
00455 safe_soundtoclient(self.owner, self, CHAN_AUTO, "nav/slope.wav", actual_sound_level, ATTN_NORM);
00456 }
00457 else if( objtype == SNAP_NAV_STRUCT_DOOR )
00458 {
00459 safe_soundtoclient(self.owner, self, CHAN_AUTO, "nav/door.wav", actual_sound_level, ATTN_NORM);
00460 }
00461 }
00462 }
00463 };
00464
00465
00466
00467
00480 void snap_nav_haz_main()
00481 {
00482 local vector v_start;
00483 local float haztype;
00484
00485
00486
00487 v_start = self.owner.origin - '0 0 25';
00488
00489
00490
00491
00492
00493
00494 if( infokey(self.owner, "agv_t_esr") == "2" )
00495 haztype = snap_nav_haz_detect(true, v_start, v_forward, false, false);
00496 else
00497 haztype = snap_nav_haz_detect(true, v_start, v_forward, false, true);
00498
00499
00500
00501
00502
00503
00504
00505 if( infokey(self.owner, "agv_t_nav_side_haz_warnings") == "1" )
00506 {
00507
00508 snap_nav_haz_detect(false, v_start, v_right, true, true);
00509
00510 snap_nav_haz_detect(false, v_start, v_right, false, true);
00511 }
00512
00519 self.weapon = haztype;
00520
00525 if( self.aiment.state == 1 )
00526 self.takedamage = snap_misc_jumptest(self.aiment.origin, self.aiment.movedir);
00527 else
00528 self.takedamage = 0;
00529 };
00530
00562 float snap_nav_haz_detect(float fwd, vector v_start, vector v_dir, float reverse, float snd)
00563 {
00564 local vector v_end;
00565 local float ledge_dist, drop_length, soundout_volume;
00566 local float retval;
00567
00574
00575 makevectors(self.owner.angles);
00576
00577
00578
00579 v_end = v_start;
00580 ledge_dist = vlen(v_end - v_start);
00581
00582
00583 while( ledge_dist < ((self.frags / 2) - 10) && pointcontents(v_end) == CONTENT_SOLID )
00584 {
00585 ledge_dist = vlen(v_end - v_start);
00586
00587
00588
00589 if( ! reverse )
00590 v_end = v_end + 10 * v_dir;
00591 else
00592 v_end = v_end - 10 * v_dir;
00593 }
00594
00595
00605 traceline(self.owner.origin, (v_end + '0 0 40'), true, self.owner);
00606 if( trace_fraction == 1
00607
00608 && pointcontents(v_end + '0 0 10') != CONTENT_SOLID
00609 )
00610 {
00612
00613
00614 traceline(v_end, v_end + 10 * v_dir, true, self.owner);
00615
00616
00617 if( ! trace_allsolid
00618 || trace_fraction != 1 )
00619 {
00642
00643 traceline(v_end, (v_end - '0 0 800') , true, self.owner);
00644
00645
00646 drop_length = vlen(trace_endpos - v_end);
00647
00648
00651
00652 if( snd )
00653 {
00654
00655 setorigin(self, v_end);
00656
00659
00660
00661 soundout_volume = ledge_dist / (self.frags / 2);
00662
00663 soundout_volume = ( 1 - soundout_volume ) * self.skin;
00664
00665
00666
00667
00668
00669 if( drop_length > 275 )
00670 {
00671 safe_soundtoclient(self.owner, self, CHAN_AUTO, "haz/drop-huge.wav", soundout_volume, ATTN_NORM);
00672 }
00673 else if( drop_length > 39 )
00674 {
00675 safe_soundtoclient(self.owner, self, CHAN_AUTO, "haz/drop-big.wav", soundout_volume, ATTN_NORM);
00676 }
00677 else if( drop_length > 16 )
00678 {
00679 safe_soundtoclient(self.owner, self, CHAN_AUTO, "haz/drop-small.wav", soundout_volume, ATTN_NORM);
00680 }
00681 }
00682
00690 if( drop_length > 16 )
00691 {
00692 if( ledge_dist < 150 )
00693 {
00694
00695 retval = pointcontents(trace_endpos);
00696 }
00697 else
00698 {
00699
00700 retval = 0;
00701 }
00702 }
00703 else
00704 {
00705
00706 retval = 10;
00707 }
00708 }
00709 else
00710 {
00711
00712 retval = 255;
00713 }
00714 }
00715 else
00716 {
00717
00718 retval = 255;
00719 }
00720
00723 if( fwd)
00724 if( retval < 20 )
00725 {
00726 setorigin( self.aiment, (v_end + '0 0 40') );
00727 self.aiment.state = 1;
00728 }
00729 else
00730 {
00731 self.aiment.state = 0;
00732 }
00733
00734 return retval;
00735 };
00736
00737
00738
00739
00746 float snap_nav_z_main()
00747 {
00748 local float z_changed;
00749
00750
00751 z_changed = true;
00752
00760 if( infokey(self.owner, "agv_t_nav_z_warnings") == "1" )
00761 {
00762
00763
00764 if( self.owner.origin_z > self.frame + 5 )
00765 {
00766 safe_soundtoclient(self.owner, self.owner, CHAN_AUTO, "nav/up.wav", 1, ATTN_NORM);
00767 }
00768 else if( self.owner.origin_z < self.frame - 5 )
00769 {
00770 safe_soundtoclient(self.owner, self.owner, CHAN_AUTO, "nav/down.wav", 1, ATTN_NORM);
00771 }
00772 else
00773 z_changed = false;
00774
00775
00776 self.frame = self.owner.origin_z;
00777 }
00778 else
00779 {
00780
00781
00782 self.frame = self.owner.origin_z;
00783 }
00784
00785 return z_changed;
00786 };
00787
00788
00789
00790
00796 void snap_nav_corners_main()
00797 {
00798
00799 if( ! time > self.wait
00800 || ! infokey(self.owner, "agv_t_nav_corner_warnings") == "1" )
00801 return;
00802
00803 local float corner_dist, found_left_corner, found_right_corner;
00804 local float corner_vol, midpoint_vol;
00805 local vector v_start, v_corner_fwd, v_corner_left, v_corner_right, v_iL, v_iR;
00806 local float passed_left_corner;
00807 passed_left_corner = false;
00808
00817
00818
00819 makevectors(self.owner.angles);
00820 v_start = self.owner.origin;
00821 v_corner_fwd = v_start;
00822 corner_dist = 0;
00823 found_left_corner = false;
00824 found_right_corner = false;
00825
00826
00827 while( corner_dist < ( self.frags - 10 )
00828 && ( pointcontents(v_corner_fwd) == CONTENT_EMPTY
00829 || pointcontents(v_corner_fwd) == CONTENT_WATER )
00830 )
00831 {
00832
00833 if( ! found_left_corner )
00834 {
00835 v_corner_left = v_corner_fwd - (self.frags/2) * v_right;
00836 found_left_corner = snap_nav_corners_check(v_corner_fwd, v_corner_left);
00837 v_iL = v_corner_fwd;
00838 }
00839
00840
00841 if( ! found_right_corner )
00842 {
00843 v_corner_right = v_corner_fwd + (self.frags/2) * v_right;
00844 found_right_corner = snap_nav_corners_check(v_corner_fwd, v_corner_right);
00845 v_iR = v_corner_fwd;
00846 }
00847
00848
00849 v_corner_fwd = v_corner_fwd + 10 * v_forward;
00850 corner_dist = vlen(v_corner_fwd - v_start);
00851 }
00852
00867 if( found_left_corner )
00868 {
00869
00870
00871
00872
00873
00874
00875
00876
00877 corner_vol = 1 - (vlen(v_iL - self.owner.origin) / self.frags)*self.lip;
00878 if( corner_vol > 1 )
00879 corner_vol = 1;
00880 else if( corner_vol < 0 )
00881 corner_vol = 0;
00882
00883
00884
00885 local entity sounderL;
00886 sounderL = spawn();
00887 sounderL.message = "weapons/tink1.wav";
00888 sounderL.dest1 = v_corner_fwd;
00889 sounderL.frags = corner_vol;
00890 sounderL.dest2 = v_corner_left;
00891 sounderL.health = corner_vol;
00892 sounderL.owner = self.owner;
00893 sounderL.think = snap_se_cornersound;
00894 sounderL.nextthink = time + 0.01;
00895
00896
00897
00898
00899 if( self.count == true && self.pos1 != v_corner_left )
00900 {
00901
00902
00903 if( vlen(v_corner_left - self.pos1) > 20 )
00904 self.count = false;
00905 }
00906 else
00907 {
00908 self.count = true;
00909 self.pos1 = v_corner_left;
00910 self.finaldest = v_iL;
00911 self.dest1 = v_forward;
00912 }
00913 }
00914
00915 if( found_right_corner )
00916 {
00917
00918
00919
00920
00921
00922
00923
00924
00925 corner_vol = 1 - (vlen(v_iR - self.owner.origin) / self.frags)*self.lip;
00926 if( corner_vol > 1 )
00927 corner_vol = 1;
00928 else if( corner_vol < 0 )
00929 corner_vol = 0;
00930
00931
00932
00933 local entity sounderR;
00934 sounderR = spawn();
00935 sounderR.message = "weapons/tink1.wav";
00936 sounderR.dest1 = v_corner_fwd;
00937 sounderR.frags = corner_vol;
00938 sounderR.dest2 = v_corner_right;
00939 sounderR.health = corner_vol;
00940 sounderR.owner = self.owner;
00941 sounderR.think = snap_se_cornersound;
00942 if( found_left_corner )
00943 sounderR.nextthink = time + 0.5;
00944 else
00945 sounderR.nextthink = time + 0.01;
00946
00947
00948
00949
00950 if( self.state == true && self.pos2 != v_corner_right )
00951 {
00952
00953
00954 if( vlen(v_corner_right - self.pos2) > 20 )
00955 self.state = false;
00956 }
00957 else
00958 {
00959 self.state = true;
00960 self.pos2 = v_corner_right;
00961 self.finalangle = v_iR;
00962 self.dest2 = v_forward;
00963 }
00964 }
00965
00968
00969
00970 if( self.count != found_left_corner )
00971 if( self.dest1 == v_forward )
00972 {
00973
00974 local entity passed_corner_snder;
00975 local float sound_level;
00976 sound_level = 1 - (vlen(self.finaldest - self.owner.origin) / self.frags)*self.lip;
00977 if( sound_level > 0 )
00978 if( sound_level <= 1 )
00979 {
00980 passed_corner_snder = spawn();
00981 passed_corner_snder.message = "weapons/ric2.wav";
00982 passed_corner_snder.dest1 = self.finaldest;
00983 passed_corner_snder.frags = sound_level;
00984 passed_corner_snder.dest2 = self.pos1;
00985 passed_corner_snder.health = sound_level;
00986 passed_corner_snder.owner = self.owner;
00987 passed_corner_snder.think = snap_se_cornersound;
00988 passed_corner_snder.nextthink = time + 0.01;
00989 }
00990 self.count = false;
00991
00992
00993
00994
00995 passed_left_corner = true;
00996 }
00997
00998
00999 if( self.state != found_right_corner )
01000 if( self.dest2 == v_forward )
01001 {
01002
01003 local entity passed_corner_snder;
01004 local float sound_level;
01005 sound_level = 1 - (vlen(self.finalangle - self.owner.origin) / self.frags)*self.lip;
01006 if( sound_level > 0 )
01007 if( sound_level <= 1 )
01008 {
01009 passed_corner_snder = spawn();
01010 passed_corner_snder.message = "weapons/ric2.wav";
01011 passed_corner_snder.dest1 = self.finalangle;
01012 passed_corner_snder.frags = sound_level;
01013 passed_corner_snder.dest2 = self.pos2;
01014 passed_corner_snder.health = sound_level;
01015 passed_corner_snder.owner = self.owner;
01016 passed_corner_snder.think = snap_se_cornersound;
01017 if( passed_left_corner )
01018 passed_corner_snder.nextthink = time + 0.5;
01019 else
01020 passed_corner_snder.nextthink = time + 0.01;
01021 }
01022 self.state = false;
01023 }
01024
01025
01026 if( found_left_corner )
01027 if( found_right_corner )
01028 self.wait = time + 1;
01029 else
01030 self.wait = time + 0.5;
01031 };
01032
01047 float snap_nav_corners_check(vector v_cmid, vector v_coff)
01048 {
01049 local float retval, length;
01050 local vector v_cornerpoint, v_m2c_dir;
01051
01052
01053
01054
01055 traceline(v_cmid, v_coff, true, self);
01056 length = vlen(trace_endpos - v_cmid);
01057 v_cornerpoint = trace_endpos;
01058 if( length > 160 )
01059 {
01060
01061
01062
01063
01064
01065 v_m2c_dir = normalize(v_coff - v_cmid);
01066
01067 v_cornerpoint = v_cornerpoint - 30 * v_m2c_dir;
01068
01069
01070
01071 traceline(self.owner.origin, v_cornerpoint, true, self);
01072 if( trace_fraction != 1
01073 && ( pointcontents(v_cornerpoint + self.owner.mins) == CONTENT_EMPTY
01074 || pointcontents(v_cornerpoint + self.owner.mins) == CONTENT_WATER )
01075 && ( pointcontents(v_cornerpoint + self.owner.maxs) == CONTENT_EMPTY
01076 || pointcontents(v_cornerpoint + self.owner.maxs) == CONTENT_WATER )
01077 )
01078
01079 {
01080
01081
01082 traceline(v_cornerpoint, v_cornerpoint - '0 0 50', true, self);
01083 if( trace_fraction != 1 )
01084 {
01085
01086 traceline(v_cmid, v_cornerpoint + '0 0 20', true, self);
01087 if( trace_fraction == 1 )
01088 {
01089 retval = true;
01090
01091 }
01092 }
01093 }
01094 }
01095 else
01096 retval = false;
01097
01098 return retval;
01099 };
01100
01101