Пример #1
0
    internal static SavedD20ActionSequence[] SaveSequences(List <ActionSequence> sequences)
    {
        var result = new SavedD20ActionSequence[sequences.Count];

        for (var i = 0; i < result.Length; i++)
        {
            var sequence = sequences[i];
            result[i] = new SavedD20ActionSequence
            {
                Actions            = sequence.d20ActArray.Select(SaveAction).ToArray(),
                IsPerforming       = sequence.IsPerforming,
                IsInterrupted      = sequence.IsInterrupted,
                CurrentActionIndex = sequence.d20aCurIdx,
                TurnStatus         = SaveTurnStatus(sequence.tbStatus),
                PerformerLocation  = sequence.performerLoc,
                IgnoreLineOfSight  = sequence.ignoreLos,
                Spell                 = ActiveSpellSaver.SaveActiveSpell(sequence.spellPktBody, false),
                Performer             = sequence.performer?.id ?? ObjectId.CreateNull(),
                PreviousSequenceIndex = sequence.prevSeq != null?sequences.IndexOf(sequence.prevSeq) : -1,
                                            InterruptedSequenceIndex = sequence.interruptSeq != null?sequences.IndexOf(sequence.interruptSeq) : -1,
            };
        }

        return(result);
    }
    public static SavedActiveSpell SaveActiveSpell(SpellPacketBody spellPacket, bool isActive)
    {
        var result = new SavedActiveSpell
        {
            Id                = spellPacket.spellId,
            IsActive          = isActive,
            SpellEnum         = spellPacket.spellEnum,
            SpellEnumOriginal = spellPacket.spellEnumOriginal,
            AnimFlags         = spellPacket.animFlags,
            CasterId          = spellPacket.caster?.id ?? ObjectId.CreateNull(),
            CasterPartSysHash = GetPartSysNameHash(spellPacket.casterPartSys),
            ClassCode         = spellPacket.spellClass,
            SpellLevel        = spellPacket.spellKnownSlotLevel,
            CasterLevel       = spellPacket.casterLevel,
            DC                = spellPacket.dc,
            AoEObjectId       = spellPacket.aoeObj?.id ?? ObjectId.CreateNull(),
            SpellObjects      = spellPacket.spellObjs
                                .Select(spellObj => (spellObj.obj.id, GetPartSysNameHash(spellObj.partSys)))
                                .ToList(),
            Targets = spellPacket.Targets
                      .Select(target => (target.Object.id, GetPartSysNameHash(target.ParticleSystem)))
                      .ToList(),
            InitialTargets    = spellPacket.InitialTargets.Select(obj => obj.id).ToHashSet(),
            Projectiles       = spellPacket.projectiles.Select(p => p.id).ToList(),
            AoECenter         = spellPacket.aoeCenter,
            AoECenterZ        = spellPacket.aoeCenterZ,
            Duration          = spellPacket.duration,
            DurationRemaining = spellPacket.durationRemaining,
            SpellRange        = spellPacket.spellRange,
            SavingThrowResult = spellPacket.savingThrowResult,
            MetaMagic         = spellPacket.metaMagicData
        };

        return(result);
    }
Пример #3
0
 public static void WriteEntries(BinaryWriter writer, List <LogbookCombatEntry> entries)
 {
     Trace.Assert(entries.Count <= 5);
     for (var i = 0; i < 5; i++)
     {
         if (i < entries.Count)
         {
             entries[i].Write(writer);
         }
         else
         {
             writer.WriteObjectId(ObjectId.CreateNull());
             writer.WriteInt32(0);
             writer.WriteInt32(0);
         }
     }
 }
Пример #4
0
 internal static SavedD20Action SaveAction(D20Action action)
 {
     return(new SavedD20Action
     {
         Type = action.d20ActType,
         Data = action.data1,
         Flags = action.d20Caf,
         TargetLocation = action.destLoc,
         DistanceTraveled = action.distTraversed,
         RadialMenuArg = action.radialMenuActualArg,
         RollHistoryId0 = action.rollHistId0,
         RollHistoryId1 = action.rollHistId1,
         RollHistoryId2 = action.rollHistId2,
         SpellData = action.d20SpellData,
         SpellId = action.spellId,
         AnimActionId = action.animID,
         Performer = action.d20APerformer?.id ?? ObjectId.CreateNull(),
         Target = action.d20ATarget?.id ?? ObjectId.CreateNull(),
     });
 }
Пример #5
0
    public void Save(BinaryWriter writer)
    {
        // 32 object ids + count for 10 groups

        for (var i = 0; i < 10; i++)
        {
            if (SavedGroups.TryGetValue(i, out var savedGroup))
            {
                writer.WriteInt32(savedGroup.Length);
            }
            else
            {
                writer.WriteInt32(0);
            }
        }

        for (var i = 0; i < 10; i++)
        {
            if (SavedGroups.TryGetValue(i, out var savedGroup))
            {
                for (var j = 0; j < 32; j++)
                {
                    if (j < savedGroup.Length)
                    {
                        writer.WriteObjectId(savedGroup[j]);
                    }
                    else
                    {
                        writer.WriteObjectId(ObjectId.CreateNull());
                    }
                }
            }
            else
            {
                for (var j = 0; j < 32; j++)
                {
                    writer.WriteObjectId(ObjectId.CreateNull());
                }
            }
        }
    }
    /// <summary>
    /// Reads a ToEE object id from the reader.
    /// </summary>
    /// <param name="reader"></param>
    /// <returns></returns>
    public static ObjectId ReadObjectId(this BinaryReader reader)
    {
        Span <byte> buffer = stackalloc byte[24];

        if (reader.Read(buffer) != buffer.Length)
        {
            throw new Exception("Failed to read 24-byte ObjectId");
        }

        var type = BitConverter.ToUInt16(buffer.Slice(0, sizeof(ushort)));

        var payload = buffer.Slice(8); // ObjectId seems to use 8-byte packed

        switch (type)
        {
        case 0:
            return(ObjectId.CreateNull());

        case 1:
            var protoId = BitConverter.ToUInt16(payload.Slice(0, sizeof(ushort)));
            return(ObjectId.CreatePrototype(protoId));

        case 2:
            var guid = MemoryMarshal.Read <Guid>(payload);
            return(ObjectId.CreatePermanent(guid));

        case 3:
            var positionalId = MemoryMarshal.Read <PositionalId>(payload);
            return(ObjectId.CreatePositional(positionalId));

        case 0xFFFE:
            throw new Exception("Cannot load 'handle' ObjectIDs because the pointers are stale!");

        case 0xFFFF:
            return(ObjectId.CreateBlocked());

        default:
            throw new Exception("Unknown ObjectId type: " + type);
        }
    }