private void RevealObject(SimulationEvent e) { String objectID = ((StringValue)e["ObjectID"]).value; SimulationObjectProxy proxy = objectProxies[objectID]; //initialize values for times to -1 proxy["DetectTime"].SetDataValue(DataValueFactory.BuildInteger(-1)); proxy["IdentifyTime"].SetDataValue(DataValueFactory.BuildInteger(-1)); proxy["TrackingTime"].SetDataValue(DataValueFactory.BuildInteger(-1)); proxy["DestroyedTime"].SetDataValue(DataValueFactory.BuildInteger(-1)); proxy["HostileActionTime"].SetDataValue(DataValueFactory.BuildInteger(-1)); proxy["GroundTruthIFF"].SetDataValue(DataValueFactory.BuildString("Unknown")); proxy["UserClassifiedIFF"].SetDataValue(DataValueFactory.BuildString("Unknown")); proxy["RevealTime"].SetDataValue(DataValueFactory.BuildInteger(time)); proxy["TrackedBy"].SetDataValue(DataValueFactory.BuildString("")); if (((AttributeCollectionValue)e["Attributes"]).attributes.ContainsKey("DefaultClassification")) { //has IFF on String iff = ((StringValue)((AttributeCollectionValue)e["Attributes"]).attributes["DefaultClassification"]).value; proxy["GroundTruthIFF"].SetDataValue(DataValueFactory.BuildString(iff)); proxy["UserClassifiedIFF"].SetDataValue(DataValueFactory.BuildString(iff)); } else { String owner = ((StringValue)proxy["OwnerID"].GetDataValue()).value; if (owner.ToLower().Contains("pirate")) { proxy["GroundTruthIFF"].SetDataValue(DataValueFactory.BuildString("Suspect")); } } proxy["IsInSeaLane"].SetDataValue(DataValueFactory.BuildBoolean(false)); proxy["IsGoingTowardsPort"].SetDataValue(DataValueFactory.BuildBoolean(false)); }
/// <summary> /// This method will send out a ViewProInitializeObject event to a specific client. /// This event will have that player add this object to their playfield. Once the /// object is in the playfield, it is able to be interacted with. /// </summary> /// <param name="targetPlayerID">Unique ID of the player recieving this event.</param> /// <param name="objectID">Unique ID of the object being revealed.</param> /// <param name="location">Location at which to display this object.</param> /// <param name="iconName">Icon file name used to display to user.</param> /// <param name="ownerID">Unique ID of the owner of the object.</param> private void SendViewProInitializeObject(string targetPlayerID, string objectID, LocationValue location, string iconName, string ownerID, bool isWeapon) { if (!activeDMs.Contains(targetPlayerID)) { return; } if (!location.exists) { return; } SimulationEvent initEvent = SimulationEventFactory.BuildEvent(ref simModel, "ViewProInitializeObject"); initEvent["Time"] = DataValueFactory.BuildInteger(currentTick); initEvent["TargetPlayer"] = DataValueFactory.BuildString(targetPlayerID); initEvent["ObjectID"] = DataValueFactory.BuildString(objectID); initEvent["Location"] = location; initEvent["OwnerID"] = DataValueFactory.BuildString(ownerID); initEvent["IsWeapon"] = DataValueFactory.BuildBoolean(isWeapon); initEvent["LabelColor"] = DataValueFactory.BuildInteger(dmColorMapping[ownerID]); String classification = GetClassificationForDM(objectID, targetPlayerID); String overrideIcon = GetClassificationBasedIcon(objectID, classification); initEvent["CurrentClassification"] = DataValueFactory.BuildString(classification); if (overrideIcon != String.Empty) { initEvent["IconName"] = DataValueFactory.BuildString(overrideIcon); } else { initEvent["IconName"] = DataValueFactory.BuildString(iconName); } distClient.PutEvent(initEvent); }
private void SendOutScenarioInfo(string playerID, string terminalID) { SimulationEvent e = SimulationEventFactory.BuildEvent(ref simModelInfo, "HandshakeInitializeGUI"); e["PlayerID"] = DataValueFactory.BuildString(playerID); //e["TerminalID"] = DataValueFactory.BuildString(dmToTerminalMap[playerID]); e["TerminalID"] = DataValueFactory.BuildString(terminalID); e["ScenarioInfo"] = DataValueFactory.BuildString("BASIC SCENARIO INFO **PLACEHOLDER**"); e["ScenarioName"] = DataValueFactory.BuildString(scenarioName); e["ScenarioDescription"] = DataValueFactory.BuildString(scenarioDescription); e["MapName"] = DataValueFactory.BuildString(mapName); e["UTMNorthing"] = DataValueFactory.BuildDouble(northing); e["UTMEasting"] = DataValueFactory.BuildDouble(easting); e["HorizontalPixelsPerMeter"] = DataValueFactory.BuildDouble(horizMetersPerPixel); e["VerticalPixelsPerMeter"] = DataValueFactory.BuildDouble(vertMetersPerPixel); e["PlayerBrief"] = DataValueFactory.BuildString(allDMs[playerID].briefing); e["IconLibrary"] = DataValueFactory.BuildString(iconLibrary); e["VoiceChatEnabled"] = DataValueFactory.BuildBoolean(voiceChatEnabled); e["VoiceChatServerName"] = DataValueFactory.BuildString(voiceChatServerName); e["VoiceChatServerPort"] = DataValueFactory.BuildInteger(voiceChatServerPort); e["VoiceChatUserPassword"] = DataValueFactory.BuildString(voiceChatPassword); e["IsObserver"] = DataValueFactory.BuildBoolean(allDMs[playerID].isObserver); e["IsForkReplay"] = DataValueFactory.BuildBoolean(isForkReplay); e["DefaultDisplayLabels"] = DataValueFactory.BuildString(displayLabels); e["DefaultDisplayTags"] = DataValueFactory.BuildString(displayTags); server.PutEvent(e); }
private void ClickHandler(SimulationEvent e) { String objectID = ((StringValue)e["ObjectID"]).value; String dmID = ((StringValue)e["UserID"]).value; if (objectID == string.Empty) { return;//weird edge case } if (objectProxies.Count == 0) { return; //another weird edge case } SimulationObjectProxy proxy = objectProxies[objectID]; //AD: TODO Need to only set this if the target object's Item belongs to the clicking DM //TODO": add attributes for onCourse, onLocation, booleans for if the objects are in the correct regions and moving towards the correct regions if (DMAssignedAsset(dmID, objectID) || IndividualDMIsLoggedIn) { if (((IntegerValue)proxy["DetectTime"].GetDataValue()).value != -1) { return; } else { proxy["DetectTime"].SetDataValue(DataValueFactory.BuildInteger(time)); proxy["DetectedBy"].SetDataValue(DataValueFactory.BuildString(((StringValue)e["UserID"]).value)); } } }
/// <summary> /// This event is broadcast out to each client. That client will attempt to put the object in motion, but will only /// succeed if the object already exists in its playfield. /// </summary> /// <param name="objectID"></param> /// <param name="ownerID"></param> /// <param name="location"></param> /// <param name="desLocation"></param> /// <param name="maxSpeed"></param> /// <param name="throttle"></param> /// <param name="time"></param> /// <param name="iconName"></param> /// <param name="isWeapon"></param> private void SendViewProMotionUpdate(string objectID, string ownerID, LocationValue location, LocationValue desLocation, double maxSpeed, double throttle, string iconName, bool isWeapon, double activeRegionSpeedMultiplier) { SimulationEvent vpmu = null; vpmu = SimulationEventFactory.BuildEvent(ref simModel, "ViewProMotionUpdate"); vpmu["ObjectID"] = DataValueFactory.BuildString(objectID); vpmu["OwnerID"] = DataValueFactory.BuildString(ownerID); vpmu["Location"] = location; vpmu["DestinationLocation"] = desLocation; //if (objectID == "Fighter01_Troop_2") //{ // Console.Out.Write(String.Format("\n{0} is moving at {1}*{2}\n", objectID, maxSpeed, activeRegionSpeedMultiplier)); //} vpmu["MaximumSpeed"] = DataValueFactory.BuildDouble(maxSpeed * activeRegionSpeedMultiplier); vpmu["Throttle"] = DataValueFactory.BuildDouble(throttle); vpmu["Time"] = DataValueFactory.BuildInteger(currentTick); vpmu["IconName"] = DataValueFactory.BuildString(iconName); //add label color to the mix vpmu["LabelColor"] = DataValueFactory.BuildInteger(dmColorMapping[ownerID]); vpmu["IsWeapon"] = DataValueFactory.BuildBoolean(isWeapon); distClient.PutEvent(vpmu); if (!movingObjects.Contains(objectID) && !DataValueFactory.CompareDataValues(location, desLocation)) { movingObjects.Add(objectID); } }
public static void Tick(int tick) { if (tick > nextEventAt + 2000) { nextEventAt = tick + 1000 * (randInt(13, 37)); simModel = modelReader.readModel("C:\\Program Files\\Aptima\\DDD 4.0\\Client\\SimulationModel.xml"); } else if (Math.Truncate(tick / 1000.0) == Math.Truncate(nextEventAt / 1000.0)) {// do something now // first update nextEventTime nextEventAt += 1000 * randInt(3, 20); if (allUnits.Keys.Count > 0) { string[] keyArray = new string[allUnits.Keys.Count]; allUnits.Keys.CopyTo(keyArray, 0); string unitToUse = keyArray[randInt(keyArray.Length)]; SimulationEvent simEvent; switch (randInt(2)) { case 0: //move a unit Location whereToGo = allUnits[unitToUse].newLocation(); Console.WriteLine("Moving " + unitToUse + " from (" + allUnits[unitToUse].position.X + "," + allUnits[unitToUse].position.Y + ") to (" + whereToGo.X.ToString() + "," + whereToGo.Y.ToString() + ")"); // Generate a moveObject request simEvent = SimulationEventFactory.BuildEvent(ref simModel, "MoveObjectRequest"); simEvent["UserID"] = DataValueFactory.BuildString("red dm"); simEvent["ObjectID"] = DataValueFactory.BuildString(unitToUse); simEvent["DestinationLocation"] = DataValueFactory.BuildLocation((double)whereToGo.X, (double)whereToGo.Y, 0.0, true); simEvent["Throttle"] = DataValueFactory.BuildDouble(randInt(75, 101) / 100.0); simEvent["Time"] = DataValueFactory.BuildInteger(tick + 3000);// '+3000" is not magic -- just a clumsy attempt to avoid a race condition EventGetter.Network.PutEvent(simEvent); break; case 1: //attack a unit string myTarget = Target.GetRandom(); if ("" != myTarget) { Console.WriteLine("Using " + unitToUse + " to attack " + myTarget); //generate an attack request simEvent = SimulationEventFactory.BuildEvent(ref simModel, "AttackObjectRequest"); simEvent["UserID"] = DataValueFactory.BuildString("red dm"); simEvent["ObjectID"] = DataValueFactory.BuildString(unitToUse); simEvent["TargetObjectID"] = DataValueFactory.BuildString(myTarget); simEvent["CapabilityName"] = DataValueFactory.BuildString("Missile"); simEvent["Time"] = DataValueFactory.BuildInteger(tick + 3000);// '+3000" is not magic -- just a clumsy attempt to avoid a race condition EventGetter.Network.PutEvent(simEvent); } break; } } } }
private void SendSystemErrorMessage(string text, string playerID) { SimulationEvent e = SimulationEventFactory.BuildEvent(ref simModelInfo, "SystemMessage"); e["Message"] = DataValueFactory.BuildString(text); e["TextColor"] = DataValueFactory.BuildInteger(-65536);//(System.Drawing.Color.Red.ToArgb()); e["PlayerID"] = DataValueFactory.BuildString(playerID); server.PutEvent(e); }
private void SendSelfDefenseAttackStarted(string attacker, string target) { SimulationEvent send = SimulationEventFactory.BuildEvent(ref simModel, "SelfDefenseAttackStarted"); send["AttackerObjectID"] = DataValueFactory.BuildString(attacker); send["TargetObjectID"] = DataValueFactory.BuildString(target); send["Time"] = DataValueFactory.BuildInteger(time); distClient.PutEvent(send); }
/// <summary> /// /// </summary> /// <param name="playerID"></param> /// <param name="message"></param> private void SendSystemMessageToPlayer(string playerID, string message) { //might be nice to send out a confirmation of player X's joining to the server //and selection of a DM. The msg would be a text chat? SimulationEvent e = SimulationEventFactory.BuildEvent(ref simModelInfo, "SystemMessage"); e["Message"] = DataValueFactory.BuildString(message); e["PlayerID"] = DataValueFactory.BuildString(playerID); e["TextColor"] = DataValueFactory.BuildInteger(System.Drawing.Color.Red.ToArgb()); server.PutEvent(e); }
private void SendTrackRemovedEvent(String dmID, String objectID) { SimulationEvent ev = new SimulationEvent(); ev.eventType = "SEAMATE_TrackRemoved"; ev.parameters.Add("UserID", DataValueFactory.BuildString(dmID)); ev.parameters.Add("ObjectID", DataValueFactory.BuildString(objectID)); ev.parameters.Add("Time", DataValueFactory.BuildInteger(time)); DDDConnection.SendSimEvent(ev); }
private void SendLoginEvent(String userID, String dmID, String teamID) { SimulationEvent ev = new SimulationEvent(); ev.eventType = "SEAMATE_ExperimenterLogin"; ev.parameters.Add("IndividualID", DataValueFactory.BuildString(userID)); ev.parameters.Add("TeamID", DataValueFactory.BuildString(teamID)); ev.parameters.Add("DM_ID", DataValueFactory.BuildString(dmID)); ev.parameters.Add("Time", DataValueFactory.BuildInteger(time)); DDDConnection.SendSimEvent(ev); }
public void Resume() { paused = false; SimulationEvent e = SimulationEventFactory.BuildEvent(ref simModel, "ResumeScenario"); e["Time"] = DataValueFactory.BuildInteger(time); if (distClient != null) { distClient.PutEvent(e); } }
public void SendStopReplayEvents() { if (simModelInfo != null) { SimulationEvent e = SimulationEventFactory.BuildEvent(ref simModelInfo, "StopReplay"); e["Time"] = DataValueFactory.BuildInteger(simulationTime);//ConvertInteger(latestTick); distClient.PutEvent(e); e = SimulationEventFactory.BuildEvent(ref simModelInfo, "ExternalApp_SimStop"); e["Time"] = DataValueFactory.BuildInteger(simulationTime);//ConvertInteger(latestTick); distClient.PutEvent(e); } }
private void SendViewProActiveRegionUpdate(string objectID, bool isVisible, int displayColor, Polygon3D poly) { SimulationEvent vpmu = null; vpmu = SimulationEventFactory.BuildEvent(ref simModel, "ViewProActiveRegionUpdate"); vpmu["ObjectID"] = DataValueFactory.BuildString(objectID); vpmu["IsVisible"] = DataValueFactory.BuildBoolean(isVisible); vpmu["DisplayColor"] = DataValueFactory.BuildInteger(displayColor); vpmu["Shape"] = poly.Footprint.GetPolygonValue(); distClient.PutEvent(vpmu); }
private void TrackAdded(SimulationEvent e) { if (objectProxies.Count == 0) { return; //another weird edge case } String objectID = ((StringValue)e["ObjectID"]).value; SimulationObjectProxy proxy = objectProxies[objectID]; string id = ((StringValue)e["UserID"]).value; proxy["TrackedBy"].SetDataValue(DataValueFactory.BuildString(id)); proxy["TrackingTime"].SetDataValue(DataValueFactory.BuildInteger(time)); }
private void AttackObject(SimulationEvent e) { String objectID = ((StringValue)e["ObjectID"]).value; SimulationObjectProxy proxy = objectProxies[objectID]; String targetID = ((StringValue)e["TargetObjectID"]).value; SimulationObjectProxy targetProxy = objectProxies[targetID]; // It's a sea vessel if it's not a BAMS or Firescout String className = ((StringValue)proxy["ClassName"].GetDataValue()).value; if (className != "BAMS" && className != "Firescout") { proxy["HostileActionTime"].SetDataValue(DataValueFactory.BuildInteger(time)); proxy["GroundTruthIFF"].SetDataValue(DataValueFactory.BuildString("Hostile")); } }
/// <summary> /// Sends out a ClientRemoveObject event for a specified object to a specified user. /// </summary> /// <param name="objectID"></param> /// <param name="playerID"></param> private void SendRemoveObjectEvent(string objectID, string playerID) { if (!activeDMs.Contains(playerID)) { return; } SimulationEvent e = SimulationEventFactory.BuildEvent(ref simModel, "ClientRemoveObject"); e["TargetPlayer"] = DataValueFactory.BuildString(playerID); e["ObjectID"] = DataValueFactory.BuildString(objectID); e["Time"] = DataValueFactory.BuildInteger(currentTick); dmViews[playerID].RemoveObject(objectID); distClient.PutEvent(e); }
/// <summary> /// /// </summary> /// <param name="playerID"></param> /// <param name="message"></param> private void SendSystemMessageToAll(string message) { //might be nice to send out a confirmation of player X's joining to the server //and selection of a DM. The msg would be a text chat? SimulationEvent e; foreach (string playerID in allDMs.Keys) { if (allDMs[playerID].availability != DecisionMaker.Availability.AVAILABLE) { e = SimulationEventFactory.BuildEvent(ref simModelInfo, "SystemMessage"); e["Message"] = DataValueFactory.BuildString(message); e["TextColor"] = DataValueFactory.BuildInteger(System.Drawing.Color.Black.ToArgb()); e["PlayerID"] = DataValueFactory.BuildString(playerID); server.PutEvent(e); } } }
/// <summary> /// This event receives an attack object, sends out the attack, and returns false if the current time /// is the same as the attack end time. This info is used to remove the attack from the attack list if the /// time is up. /// </summary> /// <param name="attack"></param> /// <returns></returns> private bool SendAttackEvent(Attack attack) { bool returnBool = true; int endTime = attack.endTime; if (endTime <= currentTick) { //attack is over returnBool = false; } SimulationEvent e = SimulationEventFactory.BuildEvent(ref simModel, "ViewProAttackUpdate"); e["AttackerID"] = DataValueFactory.BuildString(attack.attacker); e["TargetID"] = DataValueFactory.BuildString(attack.target); e["AttackEndTime"] = DataValueFactory.BuildInteger(attack.endTime); e["Time"] = DataValueFactory.BuildInteger(currentTick); distClient.PutEvent(e); return(returnBool); }
private void ObjectSelected(SimulationEvent ev) { if (((StringValue)ev["UserID"]).value != MyDM) { return; } String objectID = ((StringValue)ev["ObjectID"]).value; _mostRecentlyClickedObject = objectID; DDDObj d = GetFromAllObjects(objectID); if (d == null) { return; } String tag = "unknown"; if (d.Name != String.Empty) { tag = d.Name; } SimulationEvent evnt = new SimulationEvent(); evnt.eventType = "UpdateTag"; evnt.parameters.Add("Time", DataValueFactory.BuildInteger(time)); evnt.parameters.Add("UnitID", DataValueFactory.BuildString(objectID)); evnt.parameters.Add("Tag", DataValueFactory.BuildString(tag)); List <String> dms = new List <string>(); if (MyDM.Contains("Individ")) { dms.Add(MyDM); } else { dms.Add("BAMS DM"); dms.Add("Firescout DM"); } evnt.parameters.Add("TeamMembers", DataValueFactory.BuildStringList(dms)); DDDConnection.SendSimEvent(evnt);//.SendObjectAttributeUpdateEvent(objectID, "InitialTag", DataValueFactory.BuildString(tag)); }
public void PutEvent(SimulationEvent e) { lock (distributorLock) { if (e.eventType == "TimeTick") { currentTimeTick = ((IntegerValue)e["Time"]).value; } e["Time"] = DataValueFactory.BuildInteger(currentTimeTick); if (incoming == true) { AddToOutgoingQueues(e); } else { AddToIncomingQueue(e); } } }
public void ForceClose() { netStream.Close(0); System.Console.WriteLine("NetworkServerConnectionHandler.ConnectionHandler:ForceClose"); netStream.Dispose(); SimulationEvent ev = new SimulationEvent(); ev.eventType = "DisconnectTerminal"; ev["Time"] = DataValueFactory.BuildInteger(0); ev["TerminalID"] = DataValueFactory.BuildString(m_terminalID); if (eventDistClient != null) { eventDistClient.PutEvent(ev); networkServer.RemoveClient(eventDistClient.id); } recThread.Abort(); sendThread.Abort(); }
public DataValue GetCorrectDataValue(string key, string value) { DataValue dv = null; String attType = GetAttributeType(key); switch (attType) { case "StringType": dv = DataValueFactory.BuildString(value); break; case "IntegerType": dv = DataValueFactory.BuildInteger(Int32.Parse(value)); break; //case "LocationType": // dv = DataValueFactory.BuildLocation(value); // break; //case "VelocityType": // dv = DataValueFactory.BuildVelocity(Int32.Parse(value)); // break; case "DoubleType": dv = DataValueFactory.BuildDouble(double.Parse(value)); break; case "BooleanType": dv = DataValueFactory.BuildBoolean(bool.Parse(value)); break; //case "StringListType": // dv = DataValueFactory.BuildStringList(value); // break; default: //state table, capability, vulnerability, detectedattribute, sensor array, emitter, custom attributes, attack collection, ClassificationDisplayRulesType break; } return(dv); }
private void ClassificationChanged(SimulationEvent e) { String objectID = ((StringValue)e["ObjectID"]).value; if (objectProxies.Count == 0) { return; //another weird edge case } SimulationObjectProxy proxy = objectProxies[objectID]; proxy["IdentifyTime"].SetDataValue(DataValueFactory.BuildInteger(time)); proxy["IdentifiedBy"].SetDataValue(DataValueFactory.BuildString(((StringValue)e["UserID"]).value)); proxy["ClassifiedBy"].SetDataValue(DataValueFactory.BuildString(((StringValue)e["UserID"]).value)); String classification = ((StringValue)e["ClassificationName"]).value; proxy["UserClassifiedIFF"].SetDataValue(DataValueFactory.BuildString(classification)); if (!classifications.ContainsKey(objectID)) { classifications.Add(objectID, ""); } classifications[objectID] = classification; }
private void AttackSucceeded(SimulationEvent e) { if (objectProxies.Count == 0) { return; //another weird edge case } try { String objectID = ((StringValue)e["ObjectID"]).value; SimulationObjectProxy proxy = objectProxies[objectID]; String targetID = ((StringValue)e["TargetID"]).value; SimulationObjectProxy targetProxy = objectProxies[targetID]; String transitionState = ((StringValue)e["NewState"]).value; // It's a sea vessel if it's not a BAMS or Firescout String targetClassName = ((StringValue)targetProxy["ClassName"].GetDataValue()).value; if (targetClassName != "BAMS" && targetClassName != "Firescout" && transitionState == "Dead") { targetProxy["DestroyedTime"].SetDataValue(DataValueFactory.BuildInteger(time)); targetProxy["DestroyedBy"].SetDataValue(DataValueFactory.BuildString(objectID)); //AD: TODO Send view pro attribute event for these objects. SimulationEvent ev = SimulationEventFactory.BuildEvent(ref simModel, "ViewProAttributeUpdate"); AttributeCollectionValue acv = new AttributeCollectionValue(); // acv.attributes.Add("DestroyedTime", DataValueFactory.BuildDetectedValue(DataValueFactory.BuildInteger(time), 100)); // acv.attributes.Add("DestroyedBy", DataValueFactory.BuildDetectedValue(DataValueFactory.BuildString(objectID), 100)); acv.attributes.Add("DestroyedTime", DataValueFactory.BuildInteger(time)); acv.attributes.Add("DestroyedBy", DataValueFactory.BuildString(objectID)); ((StringValue)ev["TargetPlayer"]).value = "BAMS DM"; ((StringValue)ev["ObjectID"]).value = ((StringValue)targetProxy["ID"].GetDataValue()).value; ((StringValue)ev["OwnerID"]).value = ((StringValue)targetProxy["OwnerID"].GetDataValue()).value; ((IntegerValue)ev["Time"]).value = time * 1000; ev["Attributes"] = acv; distClient.PutEvent(ev); ((StringValue)ev["TargetPlayer"]).value = "Firescout DM"; distClient.PutEvent(ev); ((StringValue)ev["TargetPlayer"]).value = "Individual DM"; distClient.PutEvent(ev); } String targetOwnerID = ((StringValue)targetProxy["OwnerID"].GetDataValue()).value; String attackerOwnerID = ((StringValue)proxy["OwnerID"].GetDataValue()).value; if (transitionState == "Dead") { //Clear the intent of any other vessel mentioned in target's intent (pursued or pursuee). String targetIntent = ((StringValue)targetProxy["Intent"].GetDataValue()).value; if (targetIntent != "") { String[] intentArray = targetIntent.Split(":".ToCharArray()); if (intentArray.Length > 1) { SimulationObjectProxy vesselProxyToClear = objectProxies[intentArray[1]]; vesselProxyToClear["Intent"].SetDataValue(DataValueFactory.BuildString("")); } } //IF friendly, increment counter if (!targetOwnerID.ToLower().Contains("pirate")) { IncrementFriendliesLost(1); String attackClassName = ((StringValue)proxy["ClassName"].GetDataValue()).value; if (attackClassName == "BAMS" || attackClassName == "Firescout") { //IF friendly, and attacker was BAMS/FS IncrementFriendliesDestroyedByPlayers(1); } } else { //if hostile increment counter IncrementHostileTargetsDestroyed(1); } } //if (targetClassName == "BAMS" || targetClassName == "Firescout") //{ // //if bams/firescout, increment counter // IncrementHitsTakenByAssets(1); //} if (!attackerOwnerID.Contains("BAMS") && !attackerOwnerID.Contains("Firescout") && !attackerOwnerID.Contains("Individual")) { return; //the following section is only for YOUR attacks, so return if its not BAMS or FS } String attackClass = ((StringValue)proxy["ClassName"].GetDataValue()).value; String targetClassification = ""; try { targetClassification = classifications[targetID]; } catch (Exception exc) { } if (targetClassification != "Hostile" && (targetClassName != "BAMS" || targetClassName != "Firescout")) { //if asset was not classified as hostile, violated ROE IncrementRulesOfEngagementViolations(1); } } catch (Exception ex) { } }
/// <summary> /// *Intercepted Event From Client* When this event is received, you'll need to extract /// the weapon's class from the ObjectID field, and use this class along with the /// ParentObjectID to determine which weapon is actually being launched. /// </summary> /// <param name="e">Incoming event</param> private void ClientAttackRequest(SimulationEvent e) { string playerID = string.Empty; string attObjectID = string.Empty; string tarObjectID = string.Empty; string weaponName = string.Empty; int time = ((IntegerValue)e["Time"]).value; SimulationObjectProxy attackingObjectProxy; SimulationEvent sendingEvent; playerID = ((StringValue)e["PlayerID"]).value; attObjectID = ((StringValue)e["AttackingObjectID"]).value; tarObjectID = ((StringValue)e["TargetObjectID"]).value; weaponName = ((StringValue)e["WeaponOrCapabilityName"]).value; //// Added now that weapons are sent out with a quantity if (weaponName.Contains("x)") && weaponName.Contains("(")) {//Most likely a weapon with a quantity char[] ch = { '(' }; string[] splits = weaponName.Split(ch, StringSplitOptions.RemoveEmptyEntries); weaponName = splits[0].Trim(); } //// if (objectProxies.ContainsKey(attObjectID)) { attackingObjectProxy = objectProxies[attObjectID]; List <string> dockedWeapons = ((StringListValue)attackingObjectProxy["DockedWeapons"].GetDataValue()).strings; SimulationObjectProxy weaponProxy; foreach (string w in dockedWeapons) { weaponProxy = objectProxies[w]; if (((StringValue)weaponProxy["ClassName"].GetDataValue()).value == weaponName) { weaponName = w; } } if (dockedWeapons.Contains(weaponName)) { //send weapon attack sendingEvent = SimulationEventFactory.BuildEvent(ref simModel, "WeaponLaunchRequest"); sendingEvent["UserID"] = DataValueFactory.BuildString(playerID); sendingEvent["ParentObjectID"] = DataValueFactory.BuildString(attObjectID); sendingEvent["TargetObjectID"] = DataValueFactory.BuildString(tarObjectID); sendingEvent["ObjectID"] = DataValueFactory.BuildString(weaponName); sendingEvent["Time"] = DataValueFactory.BuildInteger(time); distClient.PutEvent(sendingEvent); //remove from docked weapons, per MS State bug report. If weapon launch fails, re-add subplatform to docked weapons DataValue dv = attackingObjectProxy["DockedWeapons"].GetDataValue(); bool result = dockedWeapons.Remove(weaponName); if (result) { ((StringListValue)dv).strings = dockedWeapons; attackingObjectProxy["DockedWeapons"].SetDataValue(dv); } else { //should not happen, throw error. } } else {//send capability attack sendingEvent = SimulationEventFactory.BuildEvent(ref simModel, "AttackObjectRequest"); sendingEvent["UserID"] = DataValueFactory.BuildString(playerID); sendingEvent["ObjectID"] = DataValueFactory.BuildString(attObjectID); sendingEvent["TargetObjectID"] = DataValueFactory.BuildString(tarObjectID); sendingEvent["CapabilityName"] = DataValueFactory.BuildString(weaponName); sendingEvent["Time"] = DataValueFactory.BuildInteger(time); distClient.PutEvent(sendingEvent); } } }
/// <summary> /// This method extracts an objects attributes from DetectedValues in an ACV, and then sends /// out the appropriate info to a specified player. /// </summary> /// <param name="destinationPlayerID"></param> /// <param name="objectsAttributes"></param> /// <param name="time"></param> private void SendViewProAttributeUpdate(string destinationPlayerID, AttributeCollectionValue objectsAttributes) { if (!activeDMs.Contains(destinationPlayerID)) { return; } SimulationEvent vpu = null; objectsAttributes = ExtractDetectedValuesFromACV(objectsAttributes); AddCapabilitiesAndWeaponsList(ref objectsAttributes); if (objectsAttributes.attributes.ContainsKey("Vulnerability")) { List <string> vulnerabilityList = new List <string>(); foreach (VulnerabilityValue.Transition t in ((VulnerabilityValue)objectsAttributes["Vulnerability"]).transitions) { foreach (VulnerabilityValue.TransitionCondition tc in t.conditions) { if (!vulnerabilityList.Contains(tc.capability)) { vulnerabilityList.Add(tc.capability); } } } // objectsAttributes.attributes.Remove("Vulnerability"); StringListValue sl = new StringListValue(); sl.strings = vulnerabilityList; objectsAttributes.attributes.Add("VulnerabilityList", sl as DataValue); } if (objectsAttributes.attributes.ContainsKey("Sensors")) { List <string> sensorList = new List <string>(); foreach (SensorValue sv in ((SensorArrayValue)objectsAttributes["Sensors"]).sensors) { if (!sensorList.Contains(sv.sensorName)) { sensorList.Add(sv.sensorName); } } // objectsAttributes.attributes.Remove("Sensors"); StringListValue sl = new StringListValue(); sl.strings = sensorList; objectsAttributes.attributes.Add("SensorList", sl as DataValue); } objectsAttributes["DockedObjects"] = new StringListValue(); List <string> strList = new List <string>(); //if (((StringValue)objectProxies[((StringValue)objectsAttributes["ID"]).value]["ParentObjectID"].GetDataValue()).value != string.Empty) //{ // strList.Add("Dock To Parent"); //} strList.AddRange(((StringListValue)objectProxies[((StringValue)objectsAttributes["ID"]).value]["DockedObjects"].GetDataValue()).strings); ((StringListValue)objectsAttributes["DockedObjects"]).strings = strList; vpu = SimulationEventFactory.BuildEvent(ref simModel, "ViewProAttributeUpdate"); if (!objectsAttributes.attributes.ContainsKey("MaximumSpeed")) { DoubleValue dv = new DoubleValue(); dv.value = ((DoubleValue)objectProxies[((StringValue)objectsAttributes["ID"]).value]["MaximumSpeed"].GetDataValue()).value * ((DoubleValue)objectProxies[((StringValue)objectsAttributes["ID"]).value]["ActiveRegionSpeedMultiplier"].GetDataValue()).value; objectsAttributes.attributes.Add("MaximumSpeed", dv as DataValue); } String classification = GetClassificationForDM(((StringValue)objectsAttributes["ID"]).value, destinationPlayerID); objectsAttributes["CurrentClassification"] = DataValueFactory.BuildString(classification); String overrideIcon = GetClassificationBasedIcon(((StringValue)objectsAttributes["ID"]).value, classification); if (overrideIcon != String.Empty) { objectsAttributes["IconName"] = DataValueFactory.BuildString(overrideIcon); } else { SimulationObjectProxy ob = objectProxies[((StringValue)objectsAttributes["ID"]).value]; objectsAttributes["IconName"] = DataValueFactory.BuildString(((StringValue)ob["IconName"].GetDataValue()).value); } vpu["TargetPlayer"] = DataValueFactory.BuildString(destinationPlayerID); vpu["ObjectID"] = objectsAttributes["ID"]; vpu["OwnerID"] = objectsAttributes["OwnerID"]; //RANGE RING LOGIC string ownerId = ((StringValue)objectsAttributes["OwnerID"]).value; if (((destinationPlayerID == ownerId || selectedRangeRingLevel == RangeRingLevels.FULL) || (selectedRangeRingLevel == RangeRingLevels.SENSORNETWORK && AreDecisionMakersInSharedNetwork(destinationPlayerID, ownerId))) && selectedRangeRingLevel != RangeRingLevels.DISABLED) //this needs to be based on ownership, etc. { SimulationObjectProxy objProxy = null; if (objectProxies.ContainsKey(((StringValue)objectsAttributes["ID"]).value)) { objProxy = objectProxies[((StringValue)objectsAttributes["ID"]).value]; AddRangeRings(ref objectsAttributes, ref objProxy); } else { //if not, something's wrong Console.WriteLine("HELP"); } } else { objectsAttributes.attributes.Remove("Vulnerability"); objectsAttributes.attributes.Remove("Sensors"); objectsAttributes.attributes.Remove("Capability"); } // //if (objectsAttributes.attributes.ContainsKey("MaximumSpeed")) //{ // Console.Out.Write(String.Format("{0} moving at {1}", ((StringValue)objectsAttributes["ID"]).value, ((DoubleValue)objectsAttributes["MaximumSpeed"]).value)); // //foreach (string s in objectsAttributes.attributes.Keys) // //{ // // Console.Out.Write(String.Format("{0}, ", s)); // //} // Console.Out.WriteLine(); //} vpu["Attributes"] = objectsAttributes; vpu["Time"] = DataValueFactory.BuildInteger(currentTick); string xml = DataValueFactory.XMLSerialize(objectsAttributes); AttributeCollectionValue temp = new AttributeCollectionValue(); temp.FromXML(xml); distClient.PutEvent(vpu); }