Skip to content

Commit

Permalink
Remove some uses of null and replace with optional
Browse files Browse the repository at this point in the history
  • Loading branch information
ethanmoffat committed Mar 18, 2022
1 parent cc81aa7 commit 74cd7bf
Show file tree
Hide file tree
Showing 18 changed files with 299 additions and 256 deletions.
5 changes: 3 additions & 2 deletions EOBot/BotHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using EOLib.Domain.Protocol;
using EOLib.IO.Actions;
using EOLib.Net.FileTransfer;
using Optional.Collections;
using System;
using System.IO;
using System.Linq;
Expand Down Expand Up @@ -97,9 +98,9 @@ public async Task<AccountReply> ChangePasswordAsync(string name, string oldPass,
public async Task<CharacterReply> DeleteCharacterAsync(string name, bool force)
{
var characterSelectorRepository = DependencyMaster.TypeRegistry[_botIndex].Resolve<ICharacterSelectorRepository>();
characterSelectorRepository.CharacterForDelete = characterSelectorRepository.Characters.SingleOrDefault(x => x.Name == name);
characterSelectorRepository.CharacterForDelete = characterSelectorRepository.Characters.SingleOrNone(x => x.Name == name);

if (characterSelectorRepository.CharacterForDelete == null)
if (!characterSelectorRepository.CharacterForDelete.HasValue)
{
ConsoleHelper.WriteMessage(ConsoleHelper.Type.Warning, $"Character {name} could not be deleted / does not exist");
return CharacterReply.THIS_IS_WRONG;
Expand Down
14 changes: 7 additions & 7 deletions EOLib/Domain/Character/CharacterManagementActions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,9 @@ public async Task<CharacterReply> CreateCharacter(ICharacterCreateParameters par

public async Task<short> RequestCharacterDelete()
{
var packet = new PacketBuilder(PacketFamily.Character, PacketAction.Take)
.AddInt(_characterSelectorRepository.CharacterForDelete.ID)
.Build();
var packet = _characterSelectorRepository.CharacterForDelete.Match(
some: c => new PacketBuilder(PacketFamily.Character, PacketAction.Take).AddInt(c.ID).Build(),
none: () => new EmptyPacket());

var responsePacket = await _packetSendService.SendEncodedPacketAndWaitAsync(packet);
var deleteRequestId = responsePacket.ReadShort();
Expand All @@ -67,10 +67,10 @@ public async Task<short> RequestCharacterDelete()

public async Task<CharacterReply> DeleteCharacter(short deleteRequestID)
{
var packet = new PacketBuilder(PacketFamily.Character, PacketAction.Remove)
.AddShort(deleteRequestID)
.AddInt(_characterSelectorRepository.CharacterForDelete.ID)
.Build();
var packet = _characterSelectorRepository.CharacterForDelete.Match(
some: c => new PacketBuilder(PacketFamily.Character, PacketAction.Remove).AddShort(deleteRequestID).AddInt(c.ID).Build(),
none: () => new EmptyPacket());

var responsePacket = await _packetSendService.SendEncodedPacketAndWaitAsync(packet);

var translatedData = _characterCreatePacketTranslator.TranslatePacket(responsePacket);
Expand Down
7 changes: 4 additions & 3 deletions EOLib/Domain/Login/CharacterSelectorRepository.cs
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
using System.Collections.Generic;
using AutomaticTypeMapper;
using EOLib.Domain.Character;
using Optional;

namespace EOLib.Domain.Login
{
public interface ICharacterSelectorRepository
{
IReadOnlyList<ICharacter> Characters { get; set; }

ICharacter CharacterForDelete { get; set; }
Option<ICharacter> CharacterForDelete { get; set; }
}

public interface ICharacterSelectorProvider
{
IReadOnlyList<ICharacter> Characters { get; }

ICharacter CharacterForDelete { get; }
Option<ICharacter> CharacterForDelete { get; }
}

[AutoMappedType(IsSingleton = true)]
public class CharacterSelectorRepository : ICharacterSelectorRepository, ICharacterSelectorProvider
{
public IReadOnlyList<ICharacter> Characters { get; set; }

public ICharacter CharacterForDelete { get; set; }
public Option<ICharacter> CharacterForDelete { get; set; }
}
}
31 changes: 25 additions & 6 deletions EndlessClient/Controllers/CharacterManagementController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using EOLib.Net;
using EOLib.Net.Communication;
using EOLib.Net.Connection;
using Optional;
using XNAControls;

namespace EndlessClient.Controllers
Expand Down Expand Up @@ -67,14 +68,32 @@ public async Task CreateCharacter()

public async Task DeleteCharacter(ICharacter characterToDelete)
{
if (_characterSelectorRepository.CharacterForDelete == null ||
_characterSelectorRepository.CharacterForDelete != characterToDelete)
void ShowCharacterDeleteWarning(ICharacter c)
{
_characterDialogActions.ShowCharacterDeleteWarning(characterToDelete.Name);
_characterSelectorRepository.CharacterForDelete = characterToDelete;
return;
_characterDialogActions.ShowCharacterDeleteWarning(c.Name);
_characterSelectorRepository.CharacterForDelete = Option.Some(c);
}

var warningShown = _characterSelectorRepository.CharacterForDelete.Match(
some: c =>
{
if (c != characterToDelete)
{
ShowCharacterDeleteWarning(characterToDelete);
return true;
}

return false;
},
none: () =>
{
ShowCharacterDeleteWarning(characterToDelete);
return true;
});

if (warningShown)
return;

var requestDeleteOp = _safeNetworkOperationFactory.CreateSafeBlockingOperation(_characterManagementActions.RequestCharacterDelete, SendError, RecvError);
if (!await requestDeleteOp.Invoke())
return;
Expand All @@ -91,7 +110,7 @@ public async Task DeleteCharacter(ICharacter characterToDelete)

var response = deleteOp.Result;

_characterSelectorRepository.CharacterForDelete = null;
_characterSelectorRepository.CharacterForDelete = Option.None<ICharacter>();
if (response != CharacterReply.Deleted)
{
SetInitialStateAndShowError();
Expand Down
3 changes: 2 additions & 1 deletion EndlessClient/Controllers/MapInteractionController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using EOLib.Domain.Item;
using EOLib.Domain.Map;
using EOLib.Localization;
using Optional;
using Optional.Collections;
using System;
using System.Threading.Tasks;
Expand Down Expand Up @@ -77,7 +78,7 @@ public async Task LeftClickAsync(IMapCellState cellState, IMouseCursorRenderer m
{
mouseRenderer.AnimateClick();
_hudControlProvider.GetComponent<ICharacterAnimator>(HudControlIdentifier.CharacterAnimator)
.StartMainCharacterWalkAnimation(cellState.Coordinate);
.StartMainCharacterWalkAnimation(Option.Some(cellState.Coordinate));
}
}

Expand Down
21 changes: 11 additions & 10 deletions EndlessClient/HUD/Chat/ChatBubbleActions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using EndlessClient.Rendering.Chat;
using EndlessClient.Rendering.NPC;
using EOLib.Domain.Chat;
using Optional;

namespace EndlessClient.HUD.Chat
{
Expand Down Expand Up @@ -31,16 +32,16 @@ public ChatBubbleActions(IChatProcessor chatProcessor,
public void ShowChatBubbleForMainCharacter(string input)
{
//todo: don't show chat bubble if group chat and character is not in a group (party)

var chatType = _chatTypeCalculator.CalculateChatType(input);
if (chatType != ChatType.Local &&
chatType != ChatType.Party &&
chatType != ChatType.Announce)
return;

var text = _chatProcessor.RemoveFirstCharacterIfNeeded(input, chatType, string.Empty);

_characterRendererProvider.MainCharacterRenderer.ShowChatBubble(text, chatType == ChatType.Party);
_characterRendererProvider.MainCharacterRenderer.MatchSome(r =>
{
_chatTypeCalculator.CalculateChatType(input)
.SomeWhen(x => x == ChatType.Local || x == ChatType.Party || x == ChatType.Announce)
.MatchSome(chatType =>
{
var text = _chatProcessor.RemoveFirstCharacterIfNeeded(input, chatType, string.Empty);
r.ShowChatBubble(text, chatType == ChatType.Party);
});
});
}

public void ShowChatBubbleForNPC(int index, string input)
Expand Down
4 changes: 1 addition & 3 deletions EndlessClient/HUD/Chat/ChatModeCalculator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,7 @@ public ChatModeCalculator(ICharacterProvider characterProvider)

public ChatModePictureBox.ChatMode CalculateMode(string fullTextString)
{
if(fullTextString == null)
throw new ArgumentException("Input string is null!", nameof(fullTextString));
if (fullTextString.Length == 0)
if (string.IsNullOrEmpty(fullTextString))
return ChatModePictureBox.ChatMode.NoText;

var playerIsAdmin = _characterProvider.MainCharacter.AdminLevel != AdminLevel.Player;
Expand Down
64 changes: 38 additions & 26 deletions EndlessClient/Rendering/Character/CharacterAnimationActions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using EOLib.Domain.Notifiers;
using EOLib.IO.Map;
using EOLib.IO.Repositories;
using Optional;

namespace EndlessClient.Rendering.Character
{
Expand Down Expand Up @@ -55,7 +56,7 @@ public void StartWalking()
if (!_hudControlProvider.IsInGame)
return;

Animator.StartMainCharacterWalkAnimation();
Animator.StartMainCharacterWalkAnimation(Option.None<MapCoordinate>());
ShowWaterSplashiesIfNeeded(CharacterActionState.Walking, _characterRepository.MainCharacter.ID);
}

Expand Down Expand Up @@ -122,10 +123,13 @@ public void NotifySelfSpellCast(short playerId, short spellId, int spellHp, byte
var spellGraphic = _esfFileProvider.ESFFile[spellId].Graphic;

if (playerId == _characterRepository.MainCharacter.ID)
{
_characterRendererProvider.MainCharacterRenderer.ShoutSpellCast();
_characterRendererProvider.MainCharacterRenderer.ShowSpellAnimation(spellGraphic);
_characterRendererProvider.MainCharacterRenderer.ShowDamageCounter(spellHp, percentHealth, isHeal: true);
{
_characterRendererProvider.MainCharacterRenderer.MatchSome(cr =>
{
cr.ShoutSpellCast();
cr.ShowSpellAnimation(spellGraphic);
cr.ShowDamageCounter(spellHp, percentHealth, isHeal: true);
});
}
else
{
Expand All @@ -142,7 +146,7 @@ public void NotifyTargetOtherSpellCast(short sourcePlayerID, short targetPlayerI

if (sourcePlayerID == _characterRepository.MainCharacter.ID)
{
_characterRendererProvider.MainCharacterRenderer.ShoutSpellCast();
_characterRendererProvider.MainCharacterRenderer.MatchSome(cr => cr.ShoutSpellCast());
}
else
{
Expand All @@ -152,8 +156,11 @@ public void NotifyTargetOtherSpellCast(short sourcePlayerID, short targetPlayerI

if (targetPlayerID == _characterRepository.MainCharacter.ID)
{
_characterRendererProvider.MainCharacterRenderer.ShowSpellAnimation(spellGraphic);
_characterRendererProvider.MainCharacterRenderer.ShowDamageCounter(recoveredHP, targetPercentHealth, isHeal: true);
_characterRendererProvider.MainCharacterRenderer.MatchSome(cr =>
{
cr.ShowSpellAnimation(spellGraphic);
cr.ShowDamageCounter(recoveredHP, targetPercentHealth, isHeal: true);
});
}
else
{
Expand All @@ -171,31 +178,36 @@ public void NotifyEarthquake(byte strength)
private void ShowWaterSplashiesIfNeeded(CharacterActionState action, int characterID)
{
var character = characterID == _characterRepository.MainCharacter.ID
? _characterRepository.MainCharacter
? Option.Some(_characterRepository.MainCharacter)
: _currentMapStateProvider.Characters.ContainsKey(characterID)
? _currentMapStateProvider.Characters[characterID]
: null;
? Option.Some(_currentMapStateProvider.Characters[characterID])
: Option.None<ICharacter>();

var characterRenderer = characterID == _characterRepository.MainCharacter.ID
? _characterRendererProvider.MainCharacterRenderer
: _characterRendererProvider.CharacterRenderers.ContainsKey(characterID)
? _characterRendererProvider.CharacterRenderers[characterID]
: null;

if (character == null || characterRenderer == null)
return;
? Option.Some(_characterRendererProvider.CharacterRenderers[characterID])
: Option.None<ICharacterRenderer>();

var rp = character.RenderProperties;
if (action == CharacterActionState.Attacking)
character.MatchSome(c =>
{
if (_currentMapProvider.CurrentMap.Tiles[rp.MapY, rp.MapX] == TileSpec.Water)
characterRenderer.ShowWaterSplashies();
}
else if (action == CharacterActionState.Walking)
{
if (_currentMapProvider.CurrentMap.Tiles[rp.GetDestinationY(), rp.GetDestinationX()] == TileSpec.Water)
characterRenderer.ShowWaterSplashies();
}
var rp = c.RenderProperties;

characterRenderer.MatchSome(cr =>
{
if (action == CharacterActionState.Attacking)
{
if (_currentMapProvider.CurrentMap.Tiles[rp.MapY, rp.MapX] == TileSpec.Water)
cr.ShowWaterSplashies();
}
else if (action == CharacterActionState.Walking)
{
if (_currentMapProvider.CurrentMap.Tiles[rp.GetDestinationY(), rp.GetDestinationX()] == TileSpec.Water)
cr.ShowWaterSplashies();
}

});
});
}

private ICharacterAnimator Animator => _hudControlProvider.GetComponent<ICharacterAnimator>(HudControlIdentifier.CharacterAnimator);
Expand Down
Loading

0 comments on commit 74cd7bf

Please sign in to comment.