private void TimeTick(SimulationEvent e) { int oldTime = time; DataValue dv = null; //Vec3D curVec = new Vec3D(0, 0, 0); //Vec3D destVec = new Vec3D(0, 0, 0); //Vec3D velVec = new Vec3D(0, 0, 0); Vec3D loc1 = new Vec3D(0, 0, 0); Vec3D loc2 = new Vec3D(0, 0, 0); Vec3D next1 = new Vec3D(0, 0, 0); Vec3D next2 = new Vec3D(0, 0, 0); Vec3D vel1 = new Vec3D(0, 0, 0); Vec3D vel2 = new Vec3D(0, 0, 0); dv = e["Time"]; time = ((IntegerValue)dv).value; double dTime = ((double)(time - oldTime)) / 1000; SimulationObjectProxy obProx1 = null; SimulationObjectProxy obProx2 = null; List <string> ids = new List <string>(objectProxies.Keys); string id1; SimulationEvent collision = null; double distance; double? d; while (ids.Count > 0) { id1 = ids[0]; ids.Remove(id1); foreach (string id2 in ids) { d = ObjectDistances.GetScalarDistanceBetweenObjects(id1, id2); if (d == null) { // Don't look for collisions if they aren't on the screen continue; } distance = d.Value; double objectSize1 = 0; double objectSize2 = 0; obProx1 = objectProxies[id1]; obProx2 = objectProxies[id2]; //// Don't look for collisions if they aren't on the screen dv = obProx1["Location"].GetDataValue(); //if (!((LocationValue)dv).exists) //{ // continue; //} loc1.Set((LocationValue)dv); dv = obProx2["Location"].GetDataValue(); //if (!((LocationValue)dv).exists) //{ // continue; //} loc2.Set((LocationValue)dv); if (((BooleanValue)obProx1["DockedToParent"].GetDataValue()).value) { continue; } if (((BooleanValue)obProx2["DockedToParent"].GetDataValue()).value) { continue; } // Don't look for collisions if they are owned by the same player if (StateDB.physicalObjects[id1].ownerID == StateDB.physicalObjects[id2].ownerID) { continue; } // Don't look for collisions if they are on the same team if (StateDB.physicalObjects[id1].teamName == StateDB.physicalObjects[id2].teamName) { continue; } //Don't look for collisions if they are not hostile if (StateDB.teams.ContainsKey(StateDB.physicalObjects[id1].teamName) && StateDB.teams.ContainsKey(StateDB.physicalObjects[id2].teamName)) { if (!StateDB.teams[StateDB.physicalObjects[id1].teamName].hostility.Contains(StateDB.teams[StateDB.physicalObjects[id2].teamName].id) && !StateDB.teams[StateDB.physicalObjects[id2].teamName].hostility.Contains(StateDB.teams[StateDB.physicalObjects[id1].teamName].id)) {//only continue if both teams are not hostile to one another continue; } } CapabilityValue.Effect eff = null; // check ranges and add objects to target lists for self defense sim CapabilityValue cap1 = ((CapabilityValue)obProx1["Capability"].GetDataValue()); VulnerabilityValue vul1 = ((VulnerabilityValue)obProx1["Vulnerability"].GetDataValue()); CapabilityValue cap2 = ((CapabilityValue)obProx2["Capability"].GetDataValue()); VulnerabilityValue vul2 = ((VulnerabilityValue)obProx2["Vulnerability"].GetDataValue()); //double distance = loc1.ScalerDistanceTo(loc2); eff = SimUtility.FindCapabilityEffect(cap1, vul2); dv = obProx1["TargetsInRange"].GetDataValue(); //AD: TODO need a "TargetsInSensorRange"? which can drive the ViewPro loops if (eff != null && distance <= eff.range && ((StringValue)obProx2["State"].GetDataValue()).value != "Dead") { if (!((StringListValue)dv).strings.Contains(id2)) { ((StringListValue)dv).strings.Add(id2); } } else { if (((StringListValue)dv).strings.Contains(id2)) { ((StringListValue)dv).strings.Remove(id2); } } obProx1["TargetsInRange"].SetDataValue(dv); eff = SimUtility.FindCapabilityEffect(cap2, vul1); dv = obProx2["TargetsInRange"].GetDataValue(); if (eff != null && distance <= eff.range && ((StringValue)obProx1["State"].GetDataValue()).value != "Dead") { if (!((StringListValue)dv).strings.Contains(id1)) { ((StringListValue)dv).strings.Add(id1); } } else { if (((StringListValue)dv).strings.Contains(id1)) { ((StringListValue)dv).strings.Remove(id1); } } obProx2["TargetsInRange"].SetDataValue(dv); // Don't look for collisions if they are dead if (((StringValue)obProx1["State"].GetDataValue()).value == "Dead") { continue; } if (((StringValue)obProx2["State"].GetDataValue()).value == "Dead") { continue; } // Don't look for collisions if they are too small to collide dv = obProx1["Size"].GetDataValue(); objectSize1 = ((DoubleValue)dv).value; if (objectSize1 <= 0.000001) { continue; } dv = obProx2["Size"].GetDataValue(); objectSize2 = ((DoubleValue)dv).value; if (objectSize2 <= 0.000001) { continue; } dv = obProx1["Velocity"].GetDataValue(); vel1.Set((VelocityValue)dv); dv = obProx2["Velocity"].GetDataValue(); vel2.Set((VelocityValue)dv); if (vel1.X == 0 && vel2.X == 0 && vel1.Y == 0 && vel2.Y == 0 && vel1.Z == 0 && vel2.Z == 0) { continue; } next1 = loc1.Add(vel1.Multiply(dTime)); next2 = loc2.Add(vel2.Multiply(dTime)); if (next1.ScalerDistanceTo(next2) < (objectSize1 + objectSize2)) { collision = SimulationEventFactory.BuildEvent(ref simModel, "ObjectCollision"); ((StringValue)collision["ObjectID1"]).value = id1; ((StringValue)collision["ObjectID2"]).value = id2; ((IntegerValue)collision["Time"]).value = time; distClient.PutEvent(collision); } } } /*foreach (string id1 in objectProxies.Keys) * { * foreach (string id2 in objectProxies.Keys) * { * if (id1 == id2) * { * continue; * } * obProx1 = objectProxies[id1]; * obProx2 = objectProxies[id1]; * * dv = obProx1["Location"].GetDataValue(); * loc1.Set((LocationValue)dv); * dv = obProx2["Location"].GetDataValue(); * loc2.Set((LocationValue)dv); * * } * * }*/ }
/* * private CapabilityValue.Effect FindCapabilityEffect(CapabilityValue cap, VulnerabilityValue vuln) * { * List<string> vulnNames = new List<string>(); * * foreach (VulnerabilityValue.Transition t in vuln.transitions) * { * foreach (VulnerabilityValue.TransitionCondition tc in t.conditions) * { * if (!vulnNames.Contains(tc.capability)) * { * vulnNames.Add(tc.capability); * } * } * } * * foreach (CapabilityValue.Effect e in cap.effects) * { * if (vulnNames.Contains(e.name)) * { * return e; * } * } * return null; * }*/ private void TimeTick(SimulationEvent e) { if (objectProxies == null) { objectProxies = bbClient.GetObjectProxies(); } time = ((IntegerValue)e["Time"]).value; DataValue dv = null; SimulationObjectProxy obProx = null, targetProx = null; Vec3D myLoc; Vec3D targetLoc; string targetID; bool isWeapon = false; bool pursueStarted; CapabilityValue capabilities; VulnerabilityValue vulnerabilities; CapabilityValue.Effect effect; double distance; LocationValue location; foreach (string id in objectProxies.Keys) { obProx = objectProxies[id]; // update the StateDB info if (StateDB.physicalObjects[id].ownerID == "") { string owner = ((StringValue)obProx["OwnerID"].GetDataValue()).value; if (StateDB.decisionMakers.ContainsKey(owner)) { StateDB.physicalObjects[id].ownerID = owner; } } if (StateDB.physicalObjects[id].speciesName == "") { string speciesName = ((StringValue)obProx["ClassName"].GetDataValue()).value; StateDB.physicalObjects[id].speciesName = speciesName; } if (StateDB.physicalObjects[id].ownerID != "" && StateDB.physicalObjects[id].teamName == "") { if (StateDB.decisionMakers[StateDB.physicalObjects[id].ownerID].team != null) { StateDB.physicalObjects[id].teamName = StateDB.decisionMakers[StateDB.physicalObjects[id].ownerID].team.id; } } if (((StringValue)obProx["AttackState"].GetDataValue()).value == "BEING_ATTACKED") { continue; } AttackCollectionValue attCV = (AttackCollectionValue)obProx["CurrentAttacks"].GetDataValue(); if (attCV.GetCurrentSelfDefenseAttacks().Count == 0) //if (((StringValue)obProx["AttackTargetID"].GetDataValue()).value == "") { dv = obProx["SelfDefenseStartAttack"].GetDataValue(); ((BooleanValue)dv).value = false; obProx["SelfDefenseStartAttack"].SetDataValue(dv); dv = obProx["SelfDefenseCapability"].GetDataValue(); ((StringValue)dv).value = ""; obProx["SelfDefenseCapability"].SetDataValue(dv); dv = obProx["SelfDefenseTargetID"].GetDataValue(); ((StringValue)dv).value = ""; obProx["SelfDefenseTargetID"].SetDataValue(dv); } if (((BooleanValue)obProx["SelfDefenseStartAttack"].GetDataValue()).value == true) { continue; } isWeapon = ((BooleanValue)obProx["IsWeapon"].GetDataValue()).value; pursueStarted = ((BooleanValue)obProx["PursueStarted"].GetDataValue()).value; targetID = ((StringValue)obProx["PursueTargetID"].GetDataValue()).value; capabilities = (CapabilityValue)obProx["Capability"].GetDataValue(); if (isWeapon && pursueStarted && objectProxies.ContainsKey(targetID)) { targetProx = objectProxies[targetID]; location = (LocationValue)obProx["Location"].GetDataValue(); if (!location.exists) { continue; } myLoc = new Vec3D(location); location = (LocationValue)targetProx["Location"].GetDataValue(); if (!location.exists) { continue; } targetLoc = new Vec3D(location); distance = myLoc.ScalerDistanceTo(targetLoc); vulnerabilities = (VulnerabilityValue)targetProx["Vulnerability"].GetDataValue(); //string cap = FindCapability(capabilities, vulnerabilities); effect = SimUtility.FindCapabilityEffect(capabilities, vulnerabilities); if (effect != null && distance < effect.range) { dv = obProx["SelfDefenseStartAttack"].GetDataValue(); ((BooleanValue)dv).value = true; obProx["SelfDefenseStartAttack"].SetDataValue(dv); dv = obProx["SelfDefenseCapability"].GetDataValue(); ((StringValue)dv).value = effect.name; obProx["SelfDefenseCapability"].SetDataValue(dv); dv = obProx["SelfDefenseTargetID"].GetDataValue(); ((StringValue)dv).value = targetID; obProx["SelfDefenseTargetID"].SetDataValue(dv); } else if (effect == null && distance < 1) { distClient.PutEvent(SimUtility.BuildStateChangeEvent(ref simModel, time, id, "Dead")); } continue; } string ownerID = ((StringValue)obProx["OwnerID"].GetDataValue()).value; if (StateDB.decisionMakers.ContainsKey(ownerID)) { StateDB.DecisionMaker thisDM = StateDB.decisionMakers[ownerID]; List <string> targets = ((StringListValue)obProx["TargetsInRange"].GetDataValue()).strings; //if (targets.Count == 0) //{ // continue; //} foreach (string target in targets) { SimulationObjectProxy obProx2 = objectProxies[target]; string ownerID2 = ((StringValue)obProx2["OwnerID"].GetDataValue()).value; if (!StateDB.decisionMakers.ContainsKey(ownerID2)) { continue; } StateDB.DecisionMaker thatDM = StateDB.decisionMakers[ownerID2]; vulnerabilities = (VulnerabilityValue)obProx2["Vulnerability"].GetDataValue(); effect = SimUtility.FindCapabilityEffect(capabilities, vulnerabilities); if (effect != null && thisDM.isHostile(thatDM) && !thisDM.isHuman) { dv = obProx["SelfDefenseStartAttack"].GetDataValue(); ((BooleanValue)dv).value = true; obProx["SelfDefenseStartAttack"].SetDataValue(dv); dv = obProx["SelfDefenseCapability"].GetDataValue(); ((StringValue)dv).value = effect.name; obProx["SelfDefenseCapability"].SetDataValue(dv); dv = obProx["SelfDefenseTargetID"].GetDataValue(); ((StringValue)dv).value = target; obProx["SelfDefenseTargetID"].SetDataValue(dv); break; } } } } }