Some more Deathmatch issues

Cheo

Active member
Hello, I gave the Deathmatch demo a new try to take a look at the Cover ability, but ended up having to make this whole issues list, most of which are cover related :

-When starting aiming from the right, the wall gets in our view :

Capture d’écran (1919).png

This could be fixed with a state for the camera controller that would apply a specific offset depending on the cover side.

-I was once able to get the character aiming backwards like this :

Capture d’écran (1920).png


-Aiming in first person view doesn't always work correctly, on the some of the cover points the character can end up aiming forward like this :

Capture d’écran (1931).png

Capture d’écran (1935).png


-The character can be unable to get into cover position and just stay stuck standing in front of the wall. I'm not 100% sure but I think enemy attacks and force can cause the issue.
 
-NPCs sometimes stay stuck doing nothing. For example, this one was just standing there aiming until I passed in front of him, at which point he started attacking.

Capture d’écran (1926).png

Here's what his tree looked like until that moment :

Capture d’écran (1927).png

Capture d’écran (1928).png

Capture d’écran (1929).png

Another one was completely still and stuck on the Flee task :

Capture d’écran (1930).png
 
-When the game ends and the score is displayed I get the following error (sorry for the multiple posts but there's this character limit) :
 
Code:
[Exception] ArgumentNullException: Value cannot be null.
Parameter name: key
System.Collections.Generic.Dictionary`2[TKey,TValue].FindEntry() at <787acc3c9a4c471ba7d971300105af24>:0

System.Collections.Generic.Dictionary`2[TKey,TValue].TryGetValue() at <787acc3c9a4c471ba7d971300105af24>:0

EventHandler.GetActionList() at <52329c5bb9d24a17aa3c9cbeab267298>:0

EventHandler.ExecuteEvent[T1]() at <52329c5bb9d24a17aa3c9cbeab267298>:0

FullScoreboardMonitor.ShowHideScore() at /Opsive/DeathmatchAIKit/Demo/Scripts/UI/FullScoreboardMonitor.cs:213
 211:      EventHandler.ExecuteEvent(DeathmatchManager.LocalPlayer, "OnEnableGameplayInput", !show);
 212:  }
--> 213:  EventHandler.ExecuteEvent(DeathmatchManager.LocalPlayer, "OnShowUI", !show);
 214:  // Keep the cursor disabled.
 215:  Cursor.lockState = cursorLockState;

FullScoreboardMonitor.GameOver() at /Opsive/DeathmatchAIKit/Demo/Scripts/UI/FullScoreboardMonitor.cs:227
 225:  private void GameOver(bool winner)
 226:  {
--> 227:      ShowHideScore(true, true);
 228:      m_GameOver = true;
 229:  }

Opsive.Shared.Events.InvokableAction`1[T1].Invoke() at <52329c5bb9d24a17aa3c9cbeab267298>:0

EventHandler.ExecuteEvent[T1]() at <52329c5bb9d24a17aa3c9cbeab267298>:0

Scoreboard.ReportDeathInternal() at /Opsive/DeathmatchAIKit/Demo/Scripts/Game/Scoreboard.cs:316
 314:  // The leader won if they reach the winning kill count.
 315:  if (m_Leader.Kills >= (DeathmatchManager.TeamGame ? m_TeamKillsToWin : m_FFAKillsToWin)) {
--> 316:      EventHandler.ExecuteEvent<bool>("OnGameOver", m_Leader == m_TeamStats[0]);
 317:      m_GameOver = true;
 318:  }

Scoreboard.ReportDeath() at /Opsive/DeathmatchAIKit/Demo/Scripts/Game/Scoreboard.cs:271
 269:  public static void ReportDeath(GameObject attacker, GameObject victim)
 270:  {
--> 271:      Instance.ReportDeathInternal(attacker, victim);
 272:  }

DeathmatchHealth.Die() at /Opsive/DeathmatchAIKit/Demo/Scripts/Game/DeathmatchHealth.cs:40
  38:  public override void Die(Vector3 position, Vector3 force, GameObject attacker)
  39:  {
-->  40:      Scoreboard.ReportDeath(attacker, gameObject);
  41:      if (TeamManager.IsInstantiated) {
  42:          TeamManager.CancelBackupRequest(gameObject);

Health.OnDamage() at /Opsive/UltimateCharacterController/Scripts/Traits/Health.cs:419
 417:                  if (m_NetworkInfo == null || m_NetworkInfo.HasAuthority()) {
 418:  #endif
--> 419:                      Die(damageData.Position, force, attacker);
 420:  #if ULTIMATE_CHARACTER_CONTROLLER_MULTIPLAYER
 421:                  }

CharacterHealth.OnDamage() at /Opsive/UltimateCharacterController/Scripts/Traits/CharacterHealth.cs:116
 114:  public override void OnDamage(DamageData damageData)
 115:  {
--> 116:      base.OnDamage(damageData);
 118:      if (m_DamagedEffect != null) {

DeathmatchHealth.OnDamage() at /Opsive/DeathmatchAIKit/Demo/Scripts/Game/DeathmatchHealth.cs:29
  27:      }
-->  29:      base.OnDamage(damageData);
  30:  }

Health.Damage() at /Opsive/UltimateCharacterController/Scripts/Traits/Health.cs:327
 325:  #endif
--> 327:              OnDamage(damageData);
 328:          }

DamageProcessor.Process() at /Opsive/UltimateCharacterController/Scripts/Traits/Damage/DamageProcessor.cs:282
 280:      public virtual void Process(IDamageTarget target, DamageData damageData)
 281:      {
--> 282:          target.Damage(damageData);
 283:      }
 284:  }

SimpleDamage.OnImpactInternal() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/Impact/SimpleDamage.cs:220
 218:  } else {
 219:      if (damageProcessor == null) { damageProcessor = DamageProcessor.Default; }
--> 220:      damageProcessor.Process(damageTarget, pooledDamageData);
 221:  }

ImpactAction.OnImpact() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/Impact/ImpactAction.cs:279
 277:  {
 278:      if (m_Delay <= 0) {
--> 279:          OnImpactInternal(ctx);
 280:      } else {

ImpactAction.TryInvokeOnImpact() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/Impact/ImpactAction.cs:269
 267:      }
--> 269:      OnImpact(ctx);
 270:  }

ImpactActionGroup.OnImpactInternal() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/Impact/ImpactAction.cs:142
 140:          if (m_ImpactActions[i] == null) { continue; }
--> 142:          m_ImpactActions[i].TryInvokeOnImpact(impactCallbackContext, forceImpact);
 143:      }
 144:  }

ImpactActionGroup.OnImpact() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/Impact/ImpactAction.cs:129
 127:      if (m_ImpactActions == null) { return; }
--> 129:      OnImpactInternal(impactCallbackContext, forceImpact);
 130:  }

GenericShootableImpactModule.OnImpact() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/Modules/Shootable/ImpactModule.cs:117
 115:  {
 116:      if (m_Conditions.CanImpact(impactCallbackContext)) {
--> 117:          m_ImpactActions.OnImpact(impactCallbackContext, true);
 118:      } else {
 119:          m_FailImpactActions.OnImpact(impactCallbackContext, true);

ShootableAction.OnFireImpact() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/ShootableAction.cs:347
 345:  #endif
 346:              for (int i = 0; i < m_ImpactModuleGroup.EnabledModules.Count; i++) {
--> 347:                  m_ImpactModuleGroup.EnabledModules[i].OnImpact(shootableImpactCallbackContext);
 348:  #if ULTIMATE_CHARACTER_CONTROLLER_MULTIPLAYER
 349:                  invokedBitmask |= 1 << m_ImpactModuleGroup.EnabledModules[i].ID;

HitscanShooter.HitscanFire() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/Modules/Shootable/HitscanShooter.cs:301
 299:  }
--> 301:  ShootableAction.OnFireImpact(m_ShootableImpactCallbackContext);
 303:  // Spawn a tracer which moves to the hit point.

SchedulerBase.AddEventInternal[T,U]() at <5be52286c54c47958ace04af73911405>:0

SchedulerBase.Schedule[T,U]() at <5be52286c54c47958ace04af73911405>:0

HitscanShooter.Fire() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/Modules/Shootable/HitscanShooter.cs:197
 195:  // Fire as many projectiles or hitscan bullets as the fire count specifies.
 196:  for (int i = 0; i < m_FireCount; ++i) {
--> 197:      Scheduler.Schedule(m_HitscanFireDelay, HitscanFire, dataStream, ammoData);
 198:  }

ShootableAction.TriggerItemAction() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/ShootableAction.cs:267
 265:  // The shooter will take care of removing the ammo when getting the projectile data.
 266:  // It will also call OnFire when it has done firing.
--> 267:  m_ShooterModuleGroup.FirstEnabledModule.Fire(m_ShootableUseDataStream);
 269:  // The item can complete its use.

SimpleBaseTrigger.UseItemTrigger() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/Modules/TriggerModule.cs:370
 368:  {
 369:      m_TriggerData.Force = 1;
--> 370:      UsableAction.TriggerItemAction(m_TriggerData);
 371:      m_WasTriggered = true;
 372:  }

UsableAction.UseItem() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/UsableAction.cs:521
 519:      }
--> 521:      m_TriggerActionModuleGroup.FirstEnabledModule.UseItemTrigger();
 522:  }

ShootableAction.UseItem() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/ShootableAction.cs:245
 243:      }
--> 245:      base.UseItem();
 246:  }

UsableAction.UseItemUpdateInternal() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/UsableAction.cs:665
 663:  // The item may not be able to be used.
 664:  if (CanUseItem()) {
--> 665:      UseItem();
 666:      EventHandler.ExecuteEvent<IUsableItem>(m_Character, "OnUseAbilityUsedItem", this);

UsableAction.UseItemUpdate() at /Opsive/UltimateCharacterController/Scripts/Items/Actions/UsableAction.cs:633
 631:  public virtual void UseItemUpdate(Use useItemAbility)
 632:  {
--> 633:      var isNotTryingToStop = UseItemUpdateInternal(useItemAbility);
 634:      if (IsDebugging) {
 635:          DebugLogger.SetInfo(InfoKey_IsTryingToStop, (!isNotTryingToStop).ToString());

Use.LateUpdate() at /Opsive/UltimateCharacterController/Scripts/Character/Abilities/Items/Use.cs:459
 458:          // Allow the items currently in use to be updated.
--> 459:          m_UsableItems[i].UseItemUpdate(this);
 460:      }
 461:  }

UltimateCharacterLocomotion.LateUpdateActiveAbilities() at /Opsive/UltimateCharacterController/Scripts/Character/UltimateCharacterLocomotion.cs:672
 670:  if (abilities != null) {
 671:      for (int i = 0; i < abilityCount; ++i) {
--> 672:          abilities[i].LateUpdate();
 673:      }
 674:  }

UltimateCharacterLocomotion.UpdateCharacter() at /Opsive/UltimateCharacterController/Scripts/Character/UltimateCharacterLocomotion.cs:598
 596:      // Allow the abilities to update after the character has been moved.
 597:      LateUpdateActiveAbilities(m_ActiveAbilities, ref m_ActiveAbilityCount);
--> 598:      LateUpdateActiveAbilities(m_ActiveItemAbilities, ref m_ActiveItemAbilityCount);
 599:  }

CharacterLocomotion.Move() at /Opsive/UltimateCharacterController/Scripts/Character/CharacterLocomotion.cs:561
 559:  EnableColliderCollisionLayer(false);
--> 561:  UpdateCharacter();
 563:  EnableColliderCollisionLayer(true);

SimulationManager+SmoothedCharacter.Move() at /Opsive/UltimateCharacterController/Scripts/Game/SimulationManager.cs:169
 167:      }
--> 169:      m_Locomotion.Move(horizontalMovement, forwardMovement, deltaYaw);
 170:      AssignFixedLocation();
 171:  }

SimulationManager.MoveCharacters() at /Opsive/UltimateCharacterController/Scripts/Game/SimulationManager.cs:723
 721:  for (int i = 0; i < m_Characters.Count; ++i) {
 722:      if (interpAmount == -1) {
--> 723:          m_Characters[i].Move(preMove);
 724:      } else {
 725:          if (!m_Characters[i].Locomotion.Interpolate) {

SimulationManager.FixedUpdate() at /Opsive/UltimateCharacterController/Scripts/Game/SimulationManager.cs:671
 669:  MoveCharacters(true, -1);
 670:  RotateCameras();
--> 671:  MoveCharacters(false, -1);
 672:  MoveCameras(-1);
 
-Lastly, it is an issue not related to Deathmatch only but quite visible here, ragdolls are very weird, dead characters are falling slowly, strangely and with a bit of jitter it seems.


And that's all for the moment - which is already quite a lot ! I hope all of that can be taken a good look at and that this asset will soon get a real fixing update. The cover system deserves special care considering its prevalence in shooter games.
 
Thanks for reporting. I'll let you know if I have any trouble reproducing them.
 
Top