示例#1
0
        private static byte[]? SerializeGff(CExoString fileType, CExoString version, Func <CResGFF, CResStruct, bool> serializeAction)
        {
            void *pData;
            int   dataLength;

            using CResGFF resGff       = new CResGFF();
            using CResStruct resStruct = new CResStruct();

            if (!resGff.CreateGFFFile(resStruct, fileType, version).ToBool())
            {
                return(null);
            }

            if (!serializeAction(resGff, resStruct))
            {
                return(null);
            }

            resGff.WriteGFFToPointer(&pData, &dataLength);

            byte[] serialized = new byte[dataLength];

            Marshal.Copy((IntPtr)pData, serialized, 0, dataLength);
            Marshal.FreeHGlobal((IntPtr)pData);

            return(serialized);
        }
示例#2
0
        public static CExoLocString ToExoLocString(this CExoString str, int nId = 0, byte gender = 0)
        {
            CExoLocString locString = new CExoLocString();

            locString.AddString(nId, str, gender);
            return(locString);
        }
示例#3
0
        private string TrimMessage(CExoString message)
        {
            string retVal = message.ToString();

            if (!printString)
            {
                int startIndex = retVal.IndexOf(']') + 1;
                retVal = retVal[startIndex..];
示例#4
0
        public ResourceManager()
        {
            if (Directory.Exists(HomeStorage.ResourceTemp))
            {
                Directory.Delete(HomeStorage.ResourceTemp, true);
            }

            tempAlias = CreateResourceDirectory(HomeStorage.ResourceTemp).ToExoString();
        }
示例#5
0
        private void OnWriteToLogFile(void *pExoDebugInternal, void *pMessage)
        {
            CExoString message = CExoString.FromPointer(pMessage);

            Log.Info(TrimMessage(message));

            if (callOriginal)
            {
                writeToLogFileHook !.CallOriginal(pExoDebugInternal, pMessage);
            }
        }
示例#6
0
        /// <summary>
        /// Read a CExoString from an arbitrary virtual address and return
        /// a CLR string representation of it.
        /// </summary>
        /// <param name="Offset">Supplies the offset of the CExoString
        /// object.</param>
        /// <returns>The CLR string representation.</returns>
        internal static string ReadCExoString(IntPtr Offset)
        {
            if (Offset == IntPtr.Zero)
            {
                return(String.Empty);
            }

            CExoString ExoStr = (CExoString)Marshal.PtrToStructure(Offset, typeof(CExoString));

            return(ExoStr.ToString());
        }
示例#7
0
        internal string?ResolveParsedStringFromStrRef(StrRef strRef)
        {
            CExoString rawString = tlkTable.GetSimpleString(strRef.Id);

            if (rawString != null)
            {
                tlkTable.ParseStr(rawString);
            }

            return(rawString?.ToString());
        }
示例#8
0
        public static bool IsValidGff(this CResGFF resGff, IEnumerable <string> expectedFileTypes, IEnumerable <string> expectedVersions)
        {
            CExoString sFileType    = new CExoString();
            CExoString sFileVersion = new CExoString();

            resGff.GetGFFFileInfo(sFileType, sFileVersion);

            string fileType    = sFileType.ToString();
            string fileVersion = sFileVersion.ToString();

            return(expectedVersions.Any(expectedVersion => expectedVersion == fileVersion) &&
                   expectedFileTypes.Any(expectedFileType => expectedFileType + " " == fileType));
        }
示例#9
0
        public void SetCurrentNodeText(string text, Language language = Language.English, Gender gender = Gender.Male)
        {
            CExoLocString?locString = GetCurrentNodeLocString();

            if (locString == null)
            {
                return;
            }

            CExoString exoString = text.ToExoString();

            locString.AddString((int)language, exoString, (byte)gender);
        }
示例#10
0
        public string?GetCurrentNodeText(Language language = Language.English, Gender gender = Gender.Male)
        {
            CExoLocString?locString = GetCurrentNodeLocString();

            if (locString == null)
            {
                return(null);
            }

            CExoString str = new CExoString();

            locString.GetString((int)language, str, (byte)gender, true);
            return(str.ToString());
        }
示例#11
0
        public static string ExtractLocString(this CExoLocString locStr, int nID = 0, byte gender = 0)
        {
            CExoStringData exoStringData;
            CExoString     exoString = CExoString.FromPointer(&exoStringData);

            try
            {
                locStr.GetStringLoc(nID, exoString, gender);
                return(exoString.ToString());
            }
            finally
            {
                exoString._Destructor();
            }
        }
示例#12
0
        /// <summary>
        /// Gets the contents of a .nss script file as a string.
        /// </summary>
        /// <param name="scriptName">The name of the script to get the contents of.</param>
        /// <returns>The script file contents or "" on error.</returns>
        public string?GetNSSContents(CExoString scriptName)
        {
            CScriptSourceFile scriptSourceFile = new CScriptSourceFile();
            byte *            data;
            uint size = 0;

            if (scriptSourceFile.LoadScript(scriptName, &data, &size) == 0)
            {
                string retVal = StringHelper.ReadFixedLengthString(data, (int)size);
                scriptSourceFile.UnloadScript();
                return(retVal);
            }

            return(null);
        }
示例#13
0
        internal string?GetCustomToken(StrTokenCustom customToken)
        {
            int numTokens = (int)tlkTable.m_nTokensCustom;

            CTlkTableTokenCustomArray tokenArray = CTlkTableTokenCustomArray.FromPointer(tlkTable.m_pTokensCustom);
            CTlkTableTokenCustom      token      = new CTlkTableTokenCustom {
                m_nNumber = (uint)customToken.TokenNumber
            };

            int index = BinarySearch(tokenArray, 0, numTokens, token);

            if (index < 0)
            {
                return(null);
            }

            CExoString retVal = tokenArray[index].m_sValue;

            return(retVal.ToString());
        }
示例#14
0
        internal string CreateResourceDirectory(string path)
        {
            if (string.IsNullOrEmpty(path))
            {
                throw new ArgumentOutOfRangeException(nameof(path), "Path must not be empty or null.");
            }

            string     alias    = AliasBaseName + currentIndex + AliasSuffix;
            uint       priority = BasePriority + currentIndex;
            CExoString exoAlias = alias.ToExoString();

            Log.Info("Setting up resource directory: {Alias}:{Path} (Priority: {Priority})", alias, path, priority);

            ExoBase.m_pcExoAliasList.Add(exoAlias, path.ToExoString());
            ResMan.CreateDirectory(exoAlias);
            ResMan.AddResourceDirectory(exoAlias, priority, true.ToInt());
            ResMan.UpdateResourceDirectory(exoAlias);

            currentIndex++;

            return(alias);
        }
示例#15
0
        private int OnSendServerToPlayerChatMessage(void *pMessage, ChatChannel nChatMessageType, uint oidSpeaker, void *sSpeakerMessage, uint nTellPlayerId, void *tellName)
        {
            if (!isEventHooked && !customHearingDistances)
            {
                return(sendServerToPlayerChatMessageHook.CallOriginal(pMessage, nChatMessageType, oidSpeaker, sSpeakerMessage, nTellPlayerId, tellName));
            }

            CNWSMessage message        = CNWSMessage.FromPointer(pMessage);
            CExoString  speakerMessage = CExoString.FromPointer(sSpeakerMessage);
            NwObject    speaker        = oidSpeaker.ToNwObject() !;

            bool skipMessage = ProcessEvent(nChatMessageType, speakerMessage.ToString(), speaker, NwPlayer.FromPlayerId(nTellPlayerId));

            if (skipMessage)
            {
                return(false.ToInt());
            }

            if (!customHearingDistances)
            {
                return(sendServerToPlayerChatMessageHook.CallOriginal(pMessage, nChatMessageType, oidSpeaker, sSpeakerMessage, nTellPlayerId, tellName));
            }

            CExoLinkedListInternal playerList = LowLevel.ServerExoApp.m_pcExoAppInternal.m_pNWSPlayerList.m_pcExoLinkedListInternal;

            if (playerList == null)
            {
                return(false.ToInt());
            }

            if (nChatMessageType == ChatChannel.PlayerShout && nwServer.ServerInfo.PlayOptions.DisallowShouting)
            {
                nChatMessageType = ChatChannel.PlayerTalk;
            }

            if (nChatMessageType != ChatChannel.PlayerTalk &&
                nChatMessageType != ChatChannel.PlayerWhisper &&
                nChatMessageType != ChatChannel.DmTalk &&
                nChatMessageType != ChatChannel.DmWhisper)
            {
                return(sendServerToPlayerChatMessageHook.CallOriginal(pMessage, nChatMessageType, oidSpeaker, sSpeakerMessage, nTellPlayerId, tellName));
            }

            NwGameObject?speakerGameObject = speaker as NwGameObject;
            NwArea?      speakerArea       = speakerGameObject?.Area;

            foreach (NwPlayer player in NwModule.Instance.Players)
            {
                NwCreature?controlledCreature = player.ControlledCreature;

                if (controlledCreature == null || speakerArea != null && speakerArea != controlledCreature.Area)
                {
                    continue;
                }

                float hearDistance = GetPlayerChatHearingDistance(player, nChatMessageType);
                if (speakerGameObject != null && controlledCreature.DistanceSquared(speakerGameObject) > hearDistance * hearDistance)
                {
                    continue;
                }

                switch (nChatMessageType)
                {
                case ChatChannel.PlayerTalk:
                    message.SendServerToPlayerChat_Talk(player.Player.m_nPlayerID, speaker, speakerMessage);
                    break;

                case ChatChannel.DmTalk:
                    message.SendServerToPlayerChat_DM_Talk(player.Player.m_nPlayerID, speaker, speakerMessage);
                    break;

                case ChatChannel.PlayerWhisper:
                    message.SendServerToPlayerChat_Whisper(player.Player.m_nPlayerID, speaker, speakerMessage);
                    break;

                case ChatChannel.DmWhisper:
                    message.SendServerToPlayerChat_DM_Whisper(player.Player.m_nPlayerID, speaker, speakerMessage);
                    break;
                }
            }

            return(true.ToInt());
        }
示例#16
0
        public static bool TryReadCExoString(this CResGFF resGff, CResStruct resStruct, byte *fieldName, out CExoString value)
        {
            int bSuccess;

            value = resGff.ReadFieldCExoString(resStruct, fieldName, &bSuccess);
            return(bSuccess.ToBool());
        }
示例#17
0
            private static FIELD CreateNewField(BinaryReader br, int index, int fieldOffset, int dataOrDataOffset, GffFieldType fieldType)
            {
                FIELD data;

                switch (fieldType)
                {
                case GffFieldType.BYTE:
                    data = new BYTE(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.CHAR:
                    data = new CHAR(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.WORD:
                    data = new WORD(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.SHORT:
                    data = new SHORT(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.DWORD:
                    data = new DWORD(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.INT:
                    data = new INT(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.DWORD64:
                    data = new DWORD64(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.INT64:
                    data = new INT64(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.FLOAT:
                    data = new FLOAT(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.DOUBLE:
                    data = new DOUBLE(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.CExoString:
                    data = new CExoString(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.ResRef:
                    data = new ResRef(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.CExoLocString:
                    data = new CExoLocString(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.VOID:
                    data = new VOID(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.Struct:
                    int lbl_index = br.ReadInt32();
                    data = new STRUCT(br, br.ReadInt32(), lbl_index);
                    break;

                case GffFieldType.List:
                    data = new LIST(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.Orientation:
                    data = new Orientation(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.Vector:
                    data = new Vector(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                case GffFieldType.StrRef:
                    data = new StrRef(br, fieldOffset + dataOrDataOffset * 12);
                    break;

                default:
                    throw new Exception(string.Format("UNEXPECTED FIELD TYPE \"{0}\", IN STRUCT INDEX \"{1}\"", fieldType, index));
                }

                return(data);
            }