HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Проблема c grapple.
Добавил определение текстур xeno_grapple. Все работает, но есть одно но...
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
Lost_Gamer_
NULL
Девойс

Дата регистрации: Jan 2017
Проживает: Лида
Сообщений: 17

Рейтинг



Half-Life Проблема c grapple.

http://youtu.be/e_X38m6QAg0 здесь показан баг у grapple.
Вот весь код:

C++ Source Code:
1
/***
2
*
3
*	Copyright © 1996-2001, Valve LLC. All rights reserved.
4
*
5
*	This product contains software technology licensed from Id
6
*	Software, Inc. ("Id Technology").  Id Technology © 1996 Id Software, Inc.
7
*	All Rights Reserved.
8
*
9
*   Use, distribution, and modification of this source code and/or resulting
10
*   object code is restricted to non-commercial enhancements to products from
11
*   Valve LLC.  All other use, distribution, or modification is prohibited
12
*   without written permission from Valve LLC.
13
*
14
****/
15
 
16
#include "extdll.h"
17
#include "util.h"
18
#include "cbase.h"
19
#include "monsters.h"
20
#include "weapons.h"
21
#include "nodes.h"
22
#include "player.h"
23
#include "gamerules.h"
24
#include "customentity.h"
25
#include "grapple_tonguetip.h"
26
#include <string.h>
27
 
28
#ifndef CLIENT_DLL
29
LINK_ENTITY_TO_CLASS(grapple_tonguetip, CGrappleTonguetip);
30
 
31
TYPEDESCRIPTION	CGrappleTonguetip::m_SaveData[] =
32
{
33
  DEFINE_FIELD(CGrappleTonguetip, m_pMyGrappler, FIELD_CLASSPTR),
34
};
35
 
36
IMPLEMENT_SAVERESTORE(CGrappleTonguetip, CBaseEntity);
37
 
38
//=========================================================
39
// Purpose: Spawn
40
//=========================================================
41
void CGrappleTonguetip::Spawn(void)
42
{
43
  pev->movetype = MOVETYPE_TOSS;
44
  pev->classname = MAKE_STRING("grapple_tonguetip");
45
  CheckTarget = 0;
46
  pev->solid = SOLID_BBOX;
47
  pev->rendermode = kRenderTransTexture;
48
  pev->renderamt = 0;
49
  pev->gravity = 0.01;
50
 
51
  SET_MODEL(ENT(pev), "models/v_bgrap_tonguetip.mdl");
52
 
53
  UTIL_SetSize(pev, Vector(0, 0, 0), Vector(0, 0, 0));
54
 
55
  SetTouch(&CGrappleTonguetip::TipTouch);
56
}
57
 
58
 
59
//=========================================================
60
// Purpose: CreateTip
61
//=========================================================
62
CGrappleTonguetip* CGrappleTonguetip::CreateTip(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity)
63
{
64
  CGrappleTonguetip* pTonguetip = GetClassPtr((CGrappleTonguetip *)NULL);
65
  pTonguetip->Spawn();
66
 
67
  UTIL_SetOrigin(pTonguetip->pev, vecStart);
68
  pTonguetip->pev->velocity = vecVelocity;
69
  pTonguetip->pev->owner = ENT(pevOwner);
70
  pTonguetip->m_pMyGrappler = GetClassPtr((CGrapple*)pevOwner);
71
  pTonguetip->SetThink(&CGrappleTonguetip::FlyThink);
72
  pTonguetip->pev->nextthink = gpGlobals->time + 0.1;
73
 
74
  return pTonguetip;
75
}
76
 
77
//=========================================================
78
// Purpose: FlyThink
79
//=========================================================
80
void CGrappleTonguetip::FlyThink(void)
81
{
82
  //ALERT(at_console, "FlyThink\n");
83
 
84
  pev->nextthink = gpGlobals->time + 0.1f;
85
}
86
 
87
//=========================================================
88
// Purpose: HitThink
89
//=========================================================
90
void CGrappleTonguetip::HitThink(void)
91
{
92
  //ALERT(at_console, "HitThink\n");
93
 
94
  pev->nextthink = gpGlobals->time + 0.1f;
95
}
96
 
97
//=========================================================
98
// Purpose: TipTouch
99
//=========================================================
100
void CGrappleTonguetip::TipTouch(CBaseEntity *pOther)
101
{
102
  // Do not collide with the owner.
103
  if (ENT(pOther->pev) == pev->owner || (ENT(pOther->pev) == VARS(pev->owner)->owner))
104
    return;
105
 
106
  TraceResult tr;
107
  float rgfl1[3];
108
  float rgfl2[3];
109
  const char *pTextureName;
110
  Vector vecSrc = pev->origin;
111
  Vector vecEnd = pev->origin + pev->velocity * 10;
112
 
113
  UTIL_TraceLine(vecSrc, vecEnd, dont_ignore_monsters, ENT(pev), &tr);
114
 
115
  CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit);
116
  vecSrc.CopyToArray(rgfl1);
117
  vecEnd.CopyToArray(rgfl2);
118
 
119
  if (pEntity)
120
    pTextureName = TRACE_TEXTURE(ENT(pEntity->pev), rgfl1, rgfl2);
121
  else
122
    pTextureName = TRACE_TEXTURE(ENT(0), rgfl1, rgfl2);
123
 
124
 
125
  int content = UTIL_PointContents(tr.vecEndPos);
126
  int hitFlags = pOther->pev->flags;
127
 
128
  m_pMyGrappler->m_iHitFlags	= hitFlags;
129
  //float m_IsPull;
130
  if(FClassnameIs( pOther->pev, "monster_barnacle"))
131
  {
132
    pev->velocity = Vector(0, 0, 0);
133
    pev->movetype = MOVETYPE_NONE;
134
    pev->gravity = 0.0f;
135
    m_pMyGrappler->m_fTipHit	= FALSE;
136
    hitFlags = 0;
137
    m_pMyGrappler->OnTongueTipHitSurface(tr.vecEndPos);
138
    CheckTarget = 1;
139
  }
140
 
141
  if ((hitFlags & (FL_CLIENT | FL_MONSTER)) || (FClassnameIs( pOther->pev, "ammo_spore")) || (hitFlags && pTextureName && m_pMyGrappler && (strnicmp (pTextureName, "xeno_grapple", 15) == 0)))
142
  {
143
    // Set player attached flag.
144
    if (pOther->IsPlayer())
145
      ((CBasePlayer*)pOther)->m_afPhysicsFlags |= PFLAG_ATTACHED;
146
 
147
    pev->origin = pOther->Center();
148
 
149
    pev->movetype = MOVETYPE_FOLLOW;
150
    pev->aiment = ENT(pOther->pev);
151
 
152
    pev->velocity = pev->velocity.Normalize();
153
 
154
    m_pMyGrappler->OnTongueTipHitEntity(pOther);
155
    m_pMyGrappler->m_fTipHit	= TRUE;
156
    CheckTarget = 0;
157
  }
158
  else
159
  {
160
    pev->velocity = Vector(0, 0, 0);
161
    pev->movetype = MOVETYPE_NONE;
162
    pev->gravity = 0.0f;
163
    m_pMyGrappler->m_fTipHit	= FALSE;
164
    hitFlags = 0;
165
    m_pMyGrappler->OnTongueTipHitSurface(tr.vecEndPos);
166
    CheckTarget = 1;
167
  }
168
 
169
  EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "weapons/bgrapple_impact.wav", 1, ATTN_NORM, 0, 100);
170
 
171
  SetTouch( NULL );
172
  SetThink(&CGrappleTonguetip::HitThink);
173
  pev->nextthink = gpGlobals->time + 0.1f;
174
}
175
 
176
void CGrappleTonguetip::PreRemoval(void)
177
{
178
  if (pev->aiment != NULL)
179
  {
180
    CBaseEntity* pEnt = GetClassPtr((CBaseEntity*)VARS(pev->aiment));
181
    if (pEnt && pEnt->IsPlayer())
182
    {
183
      // Remove attached flag of the target entity.
184
      ((CBasePlayer*)pEnt)->m_afPhysicsFlags &= ~PFLAG_ATTACHED;
185
    }
186
  }
187
  CBaseEntity::PreRemoval();
188
}
189
#endif
190
 
191
LINK_ENTITY_TO_CLASS(weapon_grapple, CGrapple);
192
 
193
enum bgrap_e {
194
  BGRAP_BREATHE = 0,
195
  BGRAP_LONGIDLE,
196
  BGRAP_SHORTIDLE,
197
  BGRAP_COUGH,
198
  BGRAP_DOWN,
199
  BGRAP_UP,
200
  BGRAP_FIRE,
201
  BGRAP_FIREWAITING,
202
  BGRAP_FIREREACHED,
203
  BGRAP_FIRETRAVEL,
204
  BGRAP_FIRERELEASE,
205
};
206
 
207
//=========================================================
208
// Purpose:
209
//=========================================================
210
void CGrapple::Spawn()
211
{
212
 
213
  SetThink( NULL );
214
  Precache();
215
  m_iId = WEAPON_GRAPPLE;
216
  SET_MODEL(ENT(pev), "models/w_bgrap.mdl");
217
  m_iClip = -1;
218
 
219
  m_pBeam			= NULL;
220
  m_pTongueTip	= NULL;
221
  m_fTipHit		= FALSE;
222
  m_fPlayPullSound = FALSE;
223
 
224
  m_iHitFlags		= 0;
225
  m_iFirestate	= FIRESTATE_NONE;
226
 
227
  m_flNextPullSoundTime = 0.0f;
228
 
229
  FallInit();// get ready to fall down.
230
}
231
 
232
//=========================================================
233
// Purpose:
234
//=========================================================
235
void CGrapple::Precache(void)
236
{
237
  PRECACHE_MODEL("models/v_bgrap.mdl");
238
  PRECACHE_MODEL("models/v_bgrap_tonguetip.mdl");
239
 
240
  PRECACHE_MODEL("models/w_bgrap.mdl");
241
  PRECACHE_MODEL("models/p_bgrap.mdl");
242
 
243
  PRECACHE_SOUND("weapons/alienweap_draw.wav");
244
 
245
  PRECACHE_SOUND("weapons/bgrapple_cough.wav");
246
  PRECACHE_SOUND("weapons/bgrapple_fire.wav");
247
  PRECACHE_SOUND("weapons/bgrapple_impact.wav");
248
  PRECACHE_SOUND("weapons/bgrapple_pull.wav");
249
  PRECACHE_SOUND("weapons/bgrapple_release.wav");
250
  PRECACHE_SOUND("weapons/bgrapple_wait.wav");
251
 
252
  PRECACHE_MODEL("sprites/tongue.spr");
253
}
254
 
255
//=========================================================
256
// Purpose:
257
//=========================================================
258
int CGrapple::GetItemInfo(ItemInfo *p)
259
{
260
  p->pszName = STRING(pev->classname);
261
  p->pszAmmo1 = NULL;
262
  p->iMaxAmmo1 = -1;
263
  p->pszAmmo2 = NULL;
264
  p->iMaxAmmo2 = -1;
265
  p->iMaxClip = WEAPON_GRAPPLE;
266
  p->iSlot = 0;
267
  p->iPosition = 3;
268
  p->iId = WEAPON_GRAPPLE;
269
  p->iWeight = GRAPPLE_WEIGHT;
270
  return 1;
271
}
272
 
273
//=========================================================
274
// Purpose:
275
//=========================================================
276
BOOL CGrapple::Deploy()
277
{
278
  m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.9f;
279
  m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.9f;
280
 
281
  return DefaultDeploy("models/v_bgrap.mdl", "models/p_bgrap.mdl", BGRAP_UP, "bgrap");
282
}
283
 
284
//=========================================================
285
// Purpose:
286
//=========================================================
287
void CGrapple::Holster(int skiplocal /* = 0 */)
288
{
289
  FireRelease();
290
 
291
  m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
292
  SendWeaponAnim(BGRAP_DOWN);
293
}
294
 
295
//=========================================================
296
// Purpose:
297
//=========================================================
298
void CGrapple::PrimaryAttack(void)
299
{
300
  if (m_iFirestate != FIRESTATE_NONE)
301
    return;
302
 
303
  m_iFirestate = FIRESTATE_FIRE;
304
 
305
  m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + RANDOM_FLOAT(10, 15);
306
  m_flTimeWeaponIdle = UTIL_WeaponTimeBase();
307
}
308
 
309
//=========================================================
310
// Purpose:	``
311
//=========================================================
312
void CGrapple::ItemPostFrame(void)
313
{
314
  if (!(m_pPlayer->pev->button & IN_ATTACK))
315
  {
316
    m_flLastFireTime = 0.0f;
317
  }
318
 
319
 
320
  if (m_iFirestate != FIRESTATE_NONE)
321
  {
322
    if (m_fTipHit)
323
    {
324
      Pull();
325
    }
326
 
327
    // Check if fire is still eligible.
328
    CheckFireEligibility();
329
    CheckTargets();
330
    // Check if the current tip is attached to a monster or a wall.
331
    // If the tongue tip move type is MOVETYPE_FOLLOW, then it
332
    // implies that we are targetting a monster, so it will kill
333
    // the monster when close enough.
334
    CheckTargetProximity();
335
 
336
    // Update the tip velocity and position.
337
    UpdateTongueTip();
338
 
339
    // Update the tongue beam.
340
    UpdateBeam();
341
 
342
    // Update the pull sound.
343
    UpdatePullSound();
344
  }
345
 
346
  if ((m_pPlayer->pev->button & IN_ATTACK) && CanAttack(m_flNextPrimaryAttack, gpGlobals->time, UseDecrement()))
347
  {
348
    if ((m_iClip == 0 && pszAmmo1()) || (iMaxClip() == -1 && !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()]))
349
    {
350
      m_fFireOnEmpty = TRUE;
351
    }
352
 
353
#ifndef CLIENT_DLL
354
    m_pPlayer->TabulateAmmo();
355
#endif
356
    PrimaryAttack();
357
    m_pPlayer->pev->button &= ~IN_ATTACK;
358
  }
359
  else if (!(m_pPlayer->pev->button & (IN_ATTACK | IN_ATTACK2)))
360
  {
361
    if (m_iFirestate != FIRESTATE_NONE)
362
    {
363
      FireRelease();
364
    }
365
 
366
#ifndef CLIENT_DLL
367
    // no fire buttons down
368
 
369
    m_fFireOnEmpty = FALSE;
370
 
371
    if (!IsUseable() && m_flNextPrimaryAttack < (UseDecrement() ? 0.0 : gpGlobals->time))
372
    {
373
      // weapon isn't useable, switch.
374
      if (!(iFlags() & ITEM_FLAG_NOAUTOSWITCHEMPTY) && g_pGameRules->GetNextBestWeapon(m_pPlayer, this))
375
      {
376
        m_flNextPrimaryAttack = (UseDecrement() ? 0.0 : gpGlobals->time) + 0.3;
377
        return;
378
      }
379
    }
380
#endif
381
 
382
    WeaponIdle();
383
    return;
384
  }
385
 
386
  // catch all
387
  if (ShouldWeaponIdle())
388
  {
389
    WeaponIdle();
390
  }
391
}
392
 
393
//=========================================================
394
// Purpose:
395
//=========================================================
396
void CGrapple::WeaponIdle(void)
397
{
398
  ResetEmptySound();
399
 
400
  if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase())
401
    return;
402
 
403
  if (m_iFirestate != FIRESTATE_NONE)
404
  {
405
    switch (m_iFirestate)
406
    {
407
    case FIRESTATE_FIRE:
408
        Fire();
409
      break;
410
 
411
    case FIRESTATE_FIRE2:
412
        Fire2();
413
      break;
414
 
415
    case FIRESTATE_WAIT:
416
        FireWait();
417
      break;
418
 
419
    case FIRESTATE_REACH:
420
        FireReach();
421
      break;
422
 
423
    case FIRESTATE_TRAVEL:
424
        FireTravel();
425
      break;
426
 
427
    case FIRESTATE_RELEASE:
428
        FireRelease();
429
      break;
430
 
431
    default:
432
        break;
433
    }
434
    return;
435
  }
436
 
437
  int iAnim;
438
  float flRand = UTIL_SharedRandomFloat(m_pPlayer->random_seed, 0, 1);
439
  if (flRand <= 0.8f)
440
  {
441
    iAnim = BGRAP_BREATHE;
442
    m_flTimeWeaponIdle = 2.6f;
443
  }
444
  else if (flRand <= 0.7f)
445
  {
446
    iAnim = BGRAP_LONGIDLE;
447
    m_flTimeWeaponIdle = 10.0f;
448
  }
449
  else if (flRand <= 0.95)
450
  {
451
    iAnim = BGRAP_SHORTIDLE;
452
    m_flTimeWeaponIdle = 1.3f;
453
  }
454
  else
455
  {
456
    iAnim = BGRAP_COUGH;
457
    m_flTimeWeaponIdle = 4.6f;
458
 
459
    EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/bgrapple_cough.wav", 1, ATTN_NORM);
460
  }
461
 
462
  SendWeaponAnim(iAnim, UseDecrement());
463
}
464
 
465
//=========================================================
466
// Purpose:
467
//=========================================================
468
void CGrapple::Fire(void)
469
{
470
  EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/bgrapple_fire.wav", 1, ATTN_NORM);
471
 
472
  SendWeaponAnim(BGRAP_FIRE, UseDecrement());
473
  m_iFirestate = FIRESTATE_FIRE2;
474
 
475
  m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + RANDOM_FLOAT(15, 20);
476
  m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.45f;
477
}
478
 
479
//=========================================================
480
// Purpose:
481
//=========================================================
482
void CGrapple::Fire2(void)
483
{
484
  // Create the tongue tip.
485
  CreateTongueTip();
486
 
487
  // Start the pull sound.
488
  StartPullSound();
489
 
490
  m_iFirestate = FIRESTATE_WAIT;
491
 
492
  m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + RANDOM_FLOAT(15, 20);
493
  m_flTimeWeaponIdle = UTIL_WeaponTimeBase();
494
}
495
 
496
//=========================================================
497
// Purpose:
498
//=========================================================
499
void CGrapple::FireWait(void)
500
{
501
  SendWeaponAnim(BGRAP_FIREWAITING, UseDecrement());
502
 
503
  m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + RANDOM_FLOAT(15, 20);
504
  m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5f;
505
}
506
 
507
//=========================================================
508
// Purpose:
509
//=========================================================
510
void CGrapple::FireReach(void)
511
{
512
  SendWeaponAnim(BGRAP_FIREREACHED, UseDecrement());
513
  m_iFirestate = FIRESTATE_TRAVEL;
514
 
515
  // Start pulling the owner toward tongue tip.
516
  StartPull();
517
 
518
  m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + RANDOM_FLOAT(15, 20);
519
  //m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 4.7;
520
  m_flTimeWeaponIdle = UTIL_WeaponTimeBase();
521
}
522
 
523
//=========================================================
524
// Purpose:
525
//=========================================================
526
void CGrapple::FireTravel(void)
527
{
528
  SendWeaponAnim(BGRAP_FIRETRAVEL, UseDecrement());
529
 
530
  m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + RANDOM_FLOAT(15, 20);
531
  m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.6f;
532
}
533
 
534
//=========================================================
535
// Purpose:
536
//=========================================================
537
void CGrapple::FireRelease(void)
538
{
539
  // Stop pull sound.
540
  // STOP_SOUND(ENT(pev), CHAN_VOICE, "weapons/bgrapple_pull.wav");
541
 
542
  // Play release sound.
543
  EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/bgrapple_release.wav", 1, ATTN_NORM);
544
 
545
  SendWeaponAnim(BGRAP_FIRERELEASE, UseDecrement());
546
  m_iFirestate = FIRESTATE_NONE;
547
  // Stop the pulling.
548
  StopPull();
549
 
550
  // Reset pull sound.
551
  ResetPullSound();
552
 
553
  // Destroy the tongue tip.
554
  DestroyTongueTip();
555
 
556
  m_fTipHit = FALSE;
557
  m_iHitFlags = 0;
558
 
559
  m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75f;
560
  m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.1;
561
}
562
 
563
//=========================================================
564
// Purpose:
565
//=========================================================
566
void CGrapple::OnTongueTipHitSurface(const Vector& vecTarget)
567
{
568
#ifndef CLIENT_DLL
569
  //ALERT(at_console, "Hit surface at: (%f,%f,%f).\n", vecTarget.x, vecTarget.y, vecTarget.z);
570
#endif
571
  FireReach();
572
}
573
 
574
//=========================================================
575
// Purpose:
576
//=========================================================
577
void CGrapple::OnTongueTipHitEntity(CBaseEntity* pEntity)
578
{
579
#ifndef CLIENT_DLL
580
  ALERT(at_console, "Hit entity with classname %s.\n", (char*)STRING(pEntity->pev->classname));
581
#endif
582
  FireReach();
583
}
584
//=========================================================
585
// Purpose:
586
//=========================================================
587
void CGrapple::StartPull(void)
588
{
589
#ifndef CLIENT_DLL
590
  Vector vecOrigin = m_pPlayer->pev->origin;
591
 
592
  vecOrigin.z++;
593
  UTIL_SetOrigin(m_pPlayer->pev, vecOrigin);
594
 
595
  m_pPlayer->pev->movetype = MOVETYPE_FLY;
596
  m_pPlayer->pev->gravity = 0.0f;
597
 
598
  m_pPlayer->pev->flags &= ~FL_ONGROUND;
599
 
600
  m_pPlayer->m_afPhysicsFlags |= PFLAG_LATCHING;
601
#endif
602
}
603
 
604
//=========================================================
605
// Purpose:
606
//=========================================================
607
void CGrapple::StopPull(void)
608
{
609
#ifndef CLIENT_DLL
610
  m_pPlayer->pev->movetype = MOVETYPE_WALK;
611
  m_pPlayer->pev->gravity = 1.0f;
612
 
613
  m_pPlayer->m_afPhysicsFlags &= ~PFLAG_LATCHING;
614
#endif
615
}
616
 
617
//=========================================================
618
// Purpose:
619
//=========================================================
620
void CGrapple::Pull( void )
621
{
622
#ifndef CLIENT_DLL
623
  Vector vecOwnerPos, vecTipPos, vecDirToTip;
624
  vecOwnerPos = m_pPlayer->pev->origin;
625
  vecTipPos = m_pTongueTip->pev->origin;
626
  vecDirToTip = (vecTipPos - vecOwnerPos).Normalize();
627
 
628
  m_pPlayer->pev->velocity = vecDirToTip * 450;
629
 
630
  m_pPlayer->m_afPhysicsFlags |= PFLAG_LATCHING;
631
#endif
632
}
633
 
634
//=========================================================
635
// Purpose:
636
//=========================================================
637
void CGrapple::CreateTongueTip( void )
638
{
639
#ifndef CLIENT_DLL
640
  Vector vecSrc, vecAiming, vecVel;
641
  UTIL_MakeVectors( m_pPlayer->pev->v_angle );
642
 
643
  vecSrc = m_pPlayer->GetGunPosition();
644
  vecSrc = vecSrc + gpGlobals->v_forward * 8;
645
  vecSrc = vecSrc + gpGlobals->v_right * 3;
646
  vecSrc = vecSrc + gpGlobals->v_up * -3;
647
 
648
  vecVel = gpGlobals->v_forward * 1200;
649
 
650
  //GetAttachment(0, vecSrc, vecAiming);
651
 
652
  m_pTongueTip = CGrappleTonguetip::CreateTip(pev, vecSrc, vecVel);
653
  CreateBeam(m_pTongueTip);
654
 
655
#endif
656
 
657
}
658
 
659
//=========================================================
660
// Purpose:
661
//=========================================================
662
void CGrapple::DestroyTongueTip(void)
663
{
664
#ifndef CLIENT_DLL
665
  DestroyBeam();
666
  CheckTarget = 0;
667
  if (m_pTongueTip)
668
  {
669
    UTIL_Remove(m_pTongueTip);
670
    m_pTongueTip = NULL;
671
  }
672
#endif
673
}
674
 
675
//=========================================================
676
// Purpose:
677
//=========================================================
678
void CGrapple::UpdateTongueTip(void)
679
{
680
#ifndef CLIENT_DLL
681
  if (m_pTongueTip)
682
  {
683
    Vector tipVel = m_pTongueTip->pev->velocity;
684
    Vector ownerVel = VARS(pev->owner)->velocity;
685
 
686
    Vector newVel;
687
 
688
    newVel.x = tipVel.x + (ownerVel.x * 0.02f);
689
    newVel.y = tipVel.y + (ownerVel.y * 0.05f);
690
    newVel.z = tipVel.z + (ownerVel.z * 0.01f);
691
 
692
    m_pTongueTip->pev->velocity = newVel;
693
  }
694
#endif
695
}
696
 
697
//=========================================================
698
// Purpose:
699
//=========================================================
700
void CGrapple::CreateBeam( CBaseEntity* pTongueTip )
701
{
702
#ifndef CLIENT_DLL
703
  m_pBeam = CBeam::BeamCreate("sprites/tongue.spr", 16);
704
 
705
  if (m_pBeam)
706
  {
707
    m_pBeam-&gt<img src="images/smilies/pp2.gif" border="0" alt="">ointsInit(pTongueTip->pev->origin, pev->origin);
708
    m_pBeam->SetFlags( BEAM_FSOLID );
709
    m_pBeam->SetBrightness( 100.0 );
710
 
711
    m_pBeam->SetEndAttachment( 1 );
712
    m_pBeam->pev->spawnflags |= SF_BEAM_TEMPORARY;
713
  }
714
#endif
715
}
716
 
717
//=========================================================
718
// Purpose:
719
//=========================================================
720
void CGrapple::DestroyBeam(void)
721
{
722
#ifndef CLIENT_DLL
723
  if (m_pBeam)
724
  {
725
    UTIL_Remove(m_pBeam);
726
    m_pBeam = NULL;
727
  }
728
#endif
729
}
730
 
731
//=========================================================
732
// Purpose:
733
//=========================================================
734
void CGrapple::UpdateBeam(void)
735
{
736
#ifndef CLIENT_DLL
737
  if (m_pBeam)
738
  {
739
    Vector vecSrc;
740
    UTIL_MakeVectors(m_pPlayer->pev->v_angle);
741
 
742
    vecSrc = m_pPlayer->GetGunPosition();
743
    vecSrc = vecSrc + gpGlobals->v_forward * 16;
744
    vecSrc = vecSrc + gpGlobals->v_right * 6;
745
    vecSrc = vecSrc + gpGlobals->v_up * -8;
746
    m_pBeam->SetStartPos(vecSrc);
747
    m_pBeam->SetEndPos(m_pTongueTip->pev->origin);
748
    m_pBeam->RelinkBeam();
749
  }
750
#endif
751
}
752
 
753
//=========================================================
754
// Purpose:
755
//=========================================================
756
BOOL CGrapple::CanAttack(float attack_time, float curtime, BOOL isPredicted)
757
{
758
#if defined( CLIENT_WEAPONS )
759
  if (!isPredicted)
760
#else
761
  if (1)
762
#endif
763
  {
764
    return (attack_time <= curtime) ? TRUE : FALSE;
765
  }
766
  else
767
  {
768
    return (attack_time <= 0.0) ? TRUE : FALSE;
769
  }
770
}
771
 
772
 
773
void CGrapple::StartPullSound(void)
774
{
775
  m_flNextPullSoundTime = UTIL_WeaponTimeBase();
776
  m_fPlayPullSound = TRUE;
777
}
778
 
779
void CGrapple::UpdatePullSound(void)
780
{
781
  if (!m_fPlayPullSound)
782
    return;
783
 
784
  if (m_flNextPullSoundTime <= UTIL_WeaponTimeBase())
785
  {
786
    EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/bgrapple_pull.wav", 1, ATTN_NORM);
787
    m_flNextPullSoundTime = UTIL_WeaponTimeBase() + 0.6f;
788
  }
789
}
790
 
791
void CGrapple::ResetPullSound(void)
792
{
793
  STOP_SOUND(ENT(pev), CHAN_BODY, "weapons/bgrapple_pull.wav");
794
  m_flNextPullSoundTime = 0.0f;
795
  m_fPlayPullSound = FALSE;
796
}
797
 
798
void CGrapple::CheckTargets( void )
799
{//If the target isn't monster or xeno_grapple
800
if( CheckTarget == 1)
801
{
802
  EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/bgrapple_release.wav", 1, ATTN_NORM);
803
  DestroyTongueTip();
804
  Fire2();
805
}
806
}
807
 
808
BOOL CGrapple::IsTongueColliding(const Vector& vecShootOrigin, const Vector& vecTipPos)
809
{
810
#ifndef CLIENT_DLL
811
  TraceResult tr;
812
  UTIL_TraceLine(vecShootOrigin, vecTipPos, dont_ignore_monsters, ENT(m_pPlayer->pev), &tr);
813
 
814
  if (tr.flFraction != 1.0)
815
  {
816
    if (m_pTongueTip->pev->movetype == MOVETYPE_FOLLOW)
817
    {
818
      if (tr.pHit && m_pTongueTip->pev->aiment && m_pTongueTip->pev->aiment == tr.pHit)
819
        return FALSE;
820
    }
821
 
822
    return TRUE;
823
  }
824
 
825
  return FALSE;
826
#else
827
  return TRUE;
828
#endif
829
}
830
 
831
void CGrapple::CheckFireEligibility(void)
832
{
833
#ifndef CLIENT_DLL
834
  // Do not check for this if the tongue is not valid.
835
  if (!m_pTongueTip)
836
    return;
837
 
838
  // Check if the tongue is through walls or if other things
839
  // such as entities are between the owner and the tip.
840
  if (IsTongueColliding(m_pPlayer->GetGunPosition(), m_pTongueTip->pev->origin))
841
  {
842
    // Stop firing!
843
    FireRelease();
844
  }
845
#endif
846
}
847
 
848
 
849
BOOL CGrapple::CheckTargetProximity(void)
850
{
851
#ifndef CLIENT_DLL
852
  // Do not check for this if the tongue is not valid.
853
  if (!m_pTongueTip)
854
    return FALSE;
855
 
856
  if (m_pTongueTip->pev->movetype == MOVETYPE_FOLLOW)
857
  {
858
    // Trace a hull around to see if we hit something within 20 units.
859
    TraceResult tr;
860
    UTIL_TraceHull(
861
    pev->origin,
862
    pev->origin + VARS(pev->owner)->velocity.Normalize() * 20,
863
    dont_ignore_monsters,
864
    head_hull,
865
    edict(),
866
    &tr);
867
 
868
 
869
    // Check to see if we are close enough to our target.
870
    // In the case o a monster, attempt to get a pointer to
871
    // the entity, gib it, release grappler fire.
872
    edict_t* pHit = ENT(tr.pHit);
873
    if ( pHit &&
874
    (VARS(pHit)->flags & FL_MONSTER) &&
875
    (m_pTongueTip->pev->aiment == tr.pHit))
876
    {
877
      // Get a pointer to the entity.
878
      CBaseEntity* pEnt = GetClassPtr((CBaseEntity*)VARS(tr.pHit));
879
      if (pEnt)
880
      {
881
        Attack();
882
      }
883
      else
884
      {
885
        //ALERT(at_console, "ERROR: %s attempted to reference an unlisted monster.\n", STRING(m_pTongueTip->pev->classname));
886
      }
887
 
888
      // Release fire.
889
      FireRelease();
890
    }
891
  }
892
#endif
893
  return FALSE;
894
}
895
void CGrapple::Attack( void )
896
{
897
#ifndef CLIENT_DLL
898
  //ALERT(at_console, "Attack\n");
899
 
900
  m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + gpGlobals->time + 0.5f;
901
  TraceResult tr;
902
  UTIL_TraceHull(
903
  pev->origin,
904
  pev->origin + VARS(pev->owner)->velocity.Normalize() * 20,
905
  dont_ignore_monsters,
906
  head_hull,
907
  edict(),
908
  &tr);
909
  UTIL_MakeVectors( m_pPlayer->pev->v_angle );
910
  float flDamage = gSkillData.plrDmgGrapple;
911
 
912
  if(g_pGameRules->IsMultiplayer())
913
    flDamage *= 2;
914
 
915
  ClearMultiDamage();
916
  CBaseEntity::Instance( tr.pHit )->TraceAttack( m_pPlayer->pev, flDamage, gpGlobals->v_forward, &tr, DMG_CLUB | DMG_ALWAYSGIB );
917
  ApplyMultiDamage( pev, m_pPlayer->pev );
918
#endif
919
}
920
 

Сообщить модератору | | IP: Записан
Сообщение: 166670

Старое сообщение 24-05-2017 16:45
- За что?
master07
Житель форума

Дата регистрации: Aug 2013
Проживает: гиде-то
Сообщений: 205
Возраст: 32

Рейтинг



Lost_Gamer_ Он у тебя притягивается к 0 0 0.
Если притяжение написано в Pull то смотри vecTipPos.
Ксено текстура это часть мира, а мир это тож ентитя по этому он к ней и прятигивается.
В итоге: либо это, либо где то указатель неправильный. Если скажешь где совершается передвижение от игрока к текстуре посмотрю(я не знаю, может Pull это то)

Сообщить модератору | | IP: Записан
Сообщение: 166672

Старое сообщение 25-05-2017 01:42
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6749
Возраст: 33

Рейтинг



Я код этого оружия никогда не читал, но примерно представляю, как оно работает. Не надо притягивать игрока к какой-то координате. Нужно сделать трейс от игрока к конечной точке, и если там ксен-текстура, то создавать при "касании" языка в этой точке энтитю tonguetip, и к ней уже притягивать. Судя по всему, у тебя tonguetip создаётся в нулевых координатах.

Сообщить модератору | | IP: Записан
Сообщение: 166677

Старое сообщение 26-05-2017 02:57
- За что?
Lost_Gamer_
NULL
Девойс

Дата регистрации: Jan 2017
Проживает: Лида
Сообщений: 17

Рейтинг



Цитата:
Ku2zoff писал:
Я код этого оружия никогда не читал, но примерно представляю, как оно работает. Не надо притягивать игрока к какой-то координате. Нужно сделать трейс от игрока к конечной точке, и если там ксен-текстура, то создавать при "касании" языка в этой точке энтитю tonguetip, и к ней уже притягивать. Судя по всему, у тебя tonguetip создаётся в нулевых координатах.

Ну вроде там трейс, и к концу языка прикреплена невидимая модель.
Раньше притягивалось к стаенам правильно, но я не помню как я исправлял, чтоб вообще не притягивалось. Да и я нубоват ещё. Просто надеюсь на помощь.

Сообщить модератору | | IP: Записан
Сообщение: 166681

Старое сообщение 26-05-2017 12:53
- За что?
a1batross
Житель форума

Дата регистрации: May 2016
Проживает: Москва
Сообщений: 516
Возраст: 26

Рейтинг



> pev->origin = pOther->Center();

pOther в при Touch() будет ссылаться на мир. Ну ты взял Center() от pOther, вот он и летит в нулевой оригин.

Нужно наверное брать tr.vecEndPos, если pOther является миром, и Center(), если это там монстр или ammo_spore.

Сообщить модератору | | IP: Записан
Сообщение: 166698

Старое сообщение 28-05-2017 13:27
- За что?
Lost_Gamer_
NULL
Девойс

Дата регистрации: Jan 2017
Проживает: Лида
Сообщений: 17

Рейтинг



Цитата:
a1batross писал:
> pev->origin = pOther->Center();

pOther в при Touch() будет ссылаться на мир. Ну ты взял Center() от pOther, вот он и летит в нулевой оригин.

Нужно наверное брать tr.vecEndPos, если pOther является миром, и Center(), если это там монстр или ammo_spore.

Я это закомментировал и уже разобрался создав отдельное условие
else if( pTextureName && m_pMyGrappler && (strnicmp (pTextureName, "xeno_grapple", 15) == 0))
{
pev->velocity = Vector(0, 0, 0);
pev->movetype = MOVETYPE_NONE;
pev->gravity = 0.0f;
m_pMyGrappler->m_fTipHit = TRUE;
hitFlags = 0;
m_pMyGrappler->OnTongueTipHitSurface(tr.vecEndPos);
CheckTarget = 0;
}

Сообщить модератору | | IP: Записан
Сообщение: 166699

Старое сообщение 28-05-2017 13:48
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32191
Нанёс повреждений: 392 ед.

Рейтинг



у тебя в слове "xeno_grapple" 12 символов, а ты написал 15. Вот зачем?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 166700

Старое сообщение 28-05-2017 14:13
-
Garux
Частый гость

Дата регистрации: Mar 2015
Проживает: Металлострой
Сообщений: 98

Рейтинг



strlen( "\"xeno_grapple\"," ) == 15
Вроде порядочек

Сообщить модератору | | IP: Записан
Сообщение: 166703

Старое сообщение 29-05-2017 07:11
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32191
Нанёс повреждений: 392 ед.

Рейтинг



__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 166704

Старое сообщение 29-05-2017 09:25
-
Lost_Gamer_
NULL
Девойс

Дата регистрации: Jan 2017
Проживает: Лида
Сообщений: 17

Рейтинг



BOOL CGrapple::CheckTargetProximity(void)
{
#ifndef CLIENT_DLL
// Do not check for this if the tongue is not valid.
if (!m_pTongueTip)
return FALSE;

if (m_pTongueTip->pev->movetype == MOVETYPE_FOLLOW)
{
// Trace a hull around to see if we hit something within 20 units.
TraceResult tr;
UTIL_TraceHull(
pev->origin,
pev->origin + VARS(pev->owner)->velocity.Normalize() * 20,
dont_ignore_monsters,
head_hull,
edict(),
&tr);


// Check to see if we are close enough to our target.
// In the case o a monster, attempt to get a pointer to
// the entity, gib it, release grappler fire.
edict_t* pHit = ENT(tr.pHit);
if ( pHit/* && (m_pTongueTip->pev->aiment == tr.pHit)*/)
{
// Get a pointer to the entity.
CBaseEntity* pEnt = GetClassPtr((CBaseEntity*)VARS(tr.pHit));
if (pEnt)
{
SetThink( &CGrapple::Attack );
pev->nextthink = gpGlobals->time + 1;
}
else
{
FireRelease();
}
}
}
#endif
return FALSE;
}
void CGrapple::Attack( void )
{
#ifndef CLIENT_DLL
ALERT(at_console, "Attack\n");

TraceResult tr;
UTIL_TraceHull(
pev->origin,
pev->origin + VARS(pev->owner)->velocity.Normalize() * 20,
dont_ignore_monsters,
head_hull,
edict(),
&tr);
UTIL_MakeVectors( m_pPlayer->pev->v_angle );
float flDamage = gSkillData.plrDmgGrapple;

if(g_pGameRules->IsMultiplayer())
flDamage *= 2;

ClearMultiDamage();
CBaseEntity::Instance( tr.pHit )->TraceAttack( m_pPlayer->pev, flDamage, gpGlobals->v_forward, &tr, DMG_CLUB | DMG_ALWAYSGIB );
ApplyMultiDamage( pev, m_pPlayer->pev );
#endif
}

Здесь я пытался выставить таймер для дамага.
Но получилось так, что grapple аттакует только через секунду после того, как я перестану жать пкм.
Почему? Что я не так сделал?

Сообщить модератору | | IP: Записан
Сообщение: 166727

Старое сообщение 30-05-2017 14:54
- За что?
master07
Житель форума

Дата регистрации: Aug 2013
Проживает: гиде-то
Сообщений: 205
Возраст: 32

Рейтинг



Lost_Gamer_ заведи таймер и не нужно использовать setthink. В место этого функцию атаки скинь в условие и возьми в новое условие. К примеру if(timer <= gpGlibals->time) и в нутри этого условие timer = gpGlobals->time + 1.0f

Сообщить модератору | | IP: Записан
Сообщение: 166730

Старое сообщение 30-05-2017 16:09
- За что?
Lost_Gamer_
NULL
Девойс

Дата регистрации: Jan 2017
Проживает: Лида
Сообщений: 17

Рейтинг



master07 Можно по-понятнее? Я нубоват еще.

Сообщить модератору | | IP: Записан
Сообщение: 166731

Старое сообщение 30-05-2017 16:14
- За что?
master07
Житель форума

Дата регистрации: Aug 2013
Проживает: гиде-то
Сообщений: 205
Возраст: 32

Рейтинг



Lost_Gamer_ Жду в ЛС. Чтобы не спамить.

Сообщить модератору | | IP: Записан
Сообщение: 166733

Старое сообщение 30-05-2017 16:26
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 15:25. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Проблема c grapple.
Добавил определение текстур xeno_grapple. Все работает, но есть одно но...
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024