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); }
public static CExoLocString ToExoLocString(this CExoString str, int nId = 0, byte gender = 0) { CExoLocString locString = new CExoLocString(); locString.AddString(nId, str, gender); return(locString); }
private string TrimMessage(CExoString message) { string retVal = message.ToString(); if (!printString) { int startIndex = retVal.IndexOf(']') + 1; retVal = retVal[startIndex..];
public ResourceManager() { if (Directory.Exists(HomeStorage.ResourceTemp)) { Directory.Delete(HomeStorage.ResourceTemp, true); } tempAlias = CreateResourceDirectory(HomeStorage.ResourceTemp).ToExoString(); }
private void OnWriteToLogFile(void *pExoDebugInternal, void *pMessage) { CExoString message = CExoString.FromPointer(pMessage); Log.Info(TrimMessage(message)); if (callOriginal) { writeToLogFileHook !.CallOriginal(pExoDebugInternal, pMessage); } }
/// <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()); }
internal string?ResolveParsedStringFromStrRef(StrRef strRef) { CExoString rawString = tlkTable.GetSimpleString(strRef.Id); if (rawString != null) { tlkTable.ParseStr(rawString); } return(rawString?.ToString()); }
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)); }
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); }
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()); }
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(); } }
/// <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); }
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()); }
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); }
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()); }
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()); }
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); }