private static void AddActionModelHelper( GameObject go, Dictionary <int, ActionLink> actionLinkDict, DFBlock.RdbObject rdbObj, ref DFBlock blockData, bool serialize) { DFBlock.RdbModelResource obj = rdbObj.Resources.ModelResource; string description = blockData.RdbBlock.ModelReferenceList[obj.ModelIndex].Description; int soundID_Index = obj.SoundIndex; float duration = obj.ActionResource.Duration; float magnitude = obj.ActionResource.Magnitude; int axis = obj.ActionResource.Axis; DFBlock.RdbTriggerFlags triggerFlag = DFBlock.RdbTriggerFlags.None; DFBlock.RdbActionFlags actionFlag = DFBlock.RdbActionFlags.None; if (actionLinkDict != null) { // Set action flag if valid / known if (Enum.IsDefined(typeof(DFBlock.RdbActionFlags), (DFBlock.RdbActionFlags)obj.ActionResource.Flags)) { actionFlag = (DFBlock.RdbActionFlags)obj.ActionResource.Flags; } // Set trigger flag if valid / known if (Enum.IsDefined(typeof(DFBlock.RdbTriggerFlags), (DFBlock.RdbTriggerFlags)obj.TriggerFlag_StartingLock)) { triggerFlag = (DFBlock.RdbTriggerFlags)obj.TriggerFlag_StartingLock; } // Add action node to actionLink dictionary if (!actionLinkDict.ContainsKey(rdbObj.This)) { ActionLink link; link.nextKey = obj.ActionResource.NextObjectOffset; link.prevKey = obj.ActionResource.PreviousObjectOffset; link.gameObject = go; actionLinkDict.Add(rdbObj.This, link); } } // Create unique LoadID for save sytem long loadID = 0; if (serialize) { loadID = (blockData.Index << 24) + rdbObj.This; } AddAction(go, description, soundID_Index, duration, magnitude, axis, triggerFlag, actionFlag, loadID); }
private static void AddActionFlatHelper( GameObject go, Dictionary <int, ActionLink> actionLinkDict, ref DFBlock blockData, DFBlock.RdbObject rdbObj, bool serialize = true) { DFBlock.RdbFlatResource obj = rdbObj.Resources.FlatResource; string description = "FLT"; int soundID_Index = obj.Sound_index; float duration = 0.0f; float magnitude = obj.Magnitude; int axis = obj.Magnitude; DFBlock.RdbTriggerFlags triggerFlag = DFBlock.RdbTriggerFlags.None; DFBlock.RdbActionFlags actionFlag = DFBlock.RdbActionFlags.None; //set action flag if valid / known if (Enum.IsDefined(typeof(DFBlock.RdbActionFlags), (DFBlock.RdbActionFlags)obj.Action)) { actionFlag = (DFBlock.RdbActionFlags)obj.Action; } //set trigger flag if valid / known if (Enum.IsDefined(typeof(DFBlock.RdbTriggerFlags), (DFBlock.RdbTriggerFlags)obj.TriggerFlag)) { triggerFlag = (DFBlock.RdbTriggerFlags)obj.TriggerFlag; } //add action node to actionLink dictionary if (!actionLinkDict.ContainsKey(rdbObj.This)) { ActionLink link; link.nextKey = obj.NextObjectOffset; link.prevKey = -1; link.gameObject = go; actionLinkDict.Add(rdbObj.This, link); } // Create unique LoadID for save sytem long loadID = 0; if (serialize) { loadID = (blockData.Index << 24) + rdbObj.This; } AddAction(go, description, soundID_Index, duration, magnitude, axis, triggerFlag, actionFlag, loadID); }
private static void AddAction( GameObject go, string description, int soundID_and_index, float duration, float magnitude, int axis_raw, DFBlock.RdbTriggerFlags triggerFlag, DFBlock.RdbActionFlags actionFlag, long loadID = 0 ) { DaggerfallAction action = go.AddComponent <DaggerfallAction>(); action.ModelDescription = description; action.ActionDuration = duration; action.Magnitude = magnitude; action.Index = soundID_and_index; action.TriggerFlag = triggerFlag; action.ActionFlag = actionFlag; action.LoadID = loadID; // If SaveLoadManager present in game then attach SerializableActionObject if (SaveLoadManager.Instance != null) { go.AddComponent <SerializableActionObject>(); } //if a collision type action or action flat, add DaggerFallActionCollision component if (action.TriggerFlag == DFBlock.RdbTriggerFlags.Collision01 || action.TriggerFlag == DFBlock.RdbTriggerFlags.Collision03 || action.TriggerFlag == DFBlock.RdbTriggerFlags.DualTrigger || action.TriggerFlag == DFBlock.RdbTriggerFlags.Collision09) { DaggerfallActionCollision collision = go.AddComponent <DaggerfallActionCollision>(); collision.isFlat = false; } else if (description == "FLT") { DaggerfallActionCollision collision = go.AddComponent <DaggerfallActionCollision>(); collision.isFlat = true; } switch (action.ActionFlag) { case DFBlock.RdbActionFlags.Translation: { action.Magnitude = magnitude; GetTranslationActionVector(ref action, (DFBlock.RdbActionAxes)axis_raw); } break; case DFBlock.RdbActionFlags.Rotation: { action.Magnitude = magnitude; GetRotationActionVector(ref action, (DFBlock.RdbActionAxes)axis_raw); } break; case DFBlock.RdbActionFlags.PositiveX: { action.ActionDuration = 50; action.Magnitude = axis_raw * 8; GetTranslationActionVector(ref action, DFBlock.RdbActionAxes.PositiveX); } break; case DFBlock.RdbActionFlags.NegativeX: { action.ActionDuration = 50; action.Magnitude = axis_raw * 8; GetTranslationActionVector(ref action, DFBlock.RdbActionAxes.NegativeX); } break; case DFBlock.RdbActionFlags.PositiveY: { action.ActionDuration = 50; action.Magnitude = axis_raw * 8; GetTranslationActionVector(ref action, DFBlock.RdbActionAxes.PositiveY); } break; case DFBlock.RdbActionFlags.NegativeY: { action.ActionDuration = 50; action.Magnitude = axis_raw * 8; GetTranslationActionVector(ref action, DFBlock.RdbActionAxes.NegativeY); } break; case DFBlock.RdbActionFlags.PositiveZ: { action.ActionDuration = 50; action.Magnitude = axis_raw * 8; GetTranslationActionVector(ref action, DFBlock.RdbActionAxes.PositiveZ); } break; case DFBlock.RdbActionFlags.NegativeZ: { action.ActionDuration = 50; action.Magnitude = axis_raw * 8; GetTranslationActionVector(ref action, DFBlock.RdbActionAxes.NegativeZ); } break; default: { //Dmg actions use axis value to modifiy tot. dmg. action.Magnitude = axis_raw; } break; } // A quick hack to fix special-case rotation issues. // Currently unknown if there is data indicating different rotation behaviour or if something else is happening. switch (description) { case "LID": action.ActionRotation = new Vector3(0, 0, -90f); // Coffin lids (e.g. Scourg barrow) break; case "WHE": action.ActionRotation = new Vector3(0, -360f, 0); // Wheels (e.g. Direnni Tower) break; } //Add audio AddActionAudioSource(go, (uint)action.Index); }