public void addInfluence(int userId, int value, UserSpaceObject influenceCreator) { if (this.Influence.Any(e => e.Key == userId)) { this.Influence[userId] += value; } else { this.Influence.Add(userId, value); this.InfluencedBy.Add(influenceCreator); } }
public void FetchUser() { if (this.spaceObjectType == 0) { if (!SpacegameServer.Core.Core.Instance.ships.ContainsKey(this.spaceObjectId)) { return; } this.Sender = SpacegameServer.Core.Core.Instance.ships[this.spaceObjectId]; this.userId = this.Sender.GetUserId(); } else { if (!SpacegameServer.Core.Core.Instance.colonies.ContainsKey(this.spaceObjectId)) { return; } this.Sender = SpacegameServer.Core.Core.Instance.colonies[this.spaceObjectId]; this.userId = this.Sender.GetUserId(); } }
public static void applyInfluence(Field field, int influence, int userId, UserSpaceObject influenceCreator) { //number of rings aroung the field. 1 - 10? int rings = 1; rings = InfluenceManager.InfluenceToRingNo(influence); //find all neighbouring fields of the field //use the regions to accomplish this List <Field> neigbouringFields = new List <Field>(); double factor = 1.0; for (int ring = rings; ring > 0; ring--) { //remove the influence that was needed to archieve this ring //var InfluenceOfThisRing = this.Influence - this.RingToMinInfluence(ring); var InfluenceOfThisRing = influence - InfluenceManager.RingToMinInfluence(ring); neigbouringFields.Clear(); GeometryIndex.getNeighbourFields(field, ring, neigbouringFields, rings); //factor = 1.0d / Math.Pow(ring,2); //factor = 1.0d / (ring / 2.0d + ((ring - 1) * 4.0d)); factor = 1.0 / ((ring * ring * ring) / 3.0); foreach (Field neighbour in neigbouringFields) { neighbour.addInfluence(userId, (int)(InfluenceOfThisRing * factor), influenceCreator); } factor = factor * 1.3; } //the field where the colony is on factor = 100; field.addInfluence(userId, (int)(influence * factor), influenceCreator); }
private static bool TransferChecks(int userId, UserSpaceObject sender, UserSpaceObject receiver, Transfer transfer, Ship senderShip, Ship targetShip, Colony senderColony, Colony targetColony) { //check that sender is ownder by user if (sender.GetUserId() != userId) return false; var SenderUser = Core.Instance.users[sender.GetUserId()]; var ReceiverUser = Core.Instance.users[receiver.GetUserId()]; //check that one does not move cargo from a neutral (0) space station (hullId 201) if (sender is Ship) { var SendShip = (Ship)sender; if (SendShip.hullid == 201 && SendShip.userid == 0) return false; } if (receiver is Ship) { var RecShip = (Ship)receiver; if (RecShip.hullid == 201 && RecShip.userid == 0) return false; } //test if goods are sent or received: if (transfer.Goods.Count == 0) return false; var send = false; var receive = false; receive = (transfer.Goods.Any(e => e.Qty < 0)); send = (transfer.Goods.Any(e => e.Qty > 0)); if (!send && !receive) return false; //if trade is between users, and goods are received, check that they are at war if (receive && sender.GetUserId() != receiver.GetUserId() && receiver.GetUserId() != 0) { Relation CurrentRelation = Core.Instance.userRelations.getRelation(SenderUser, ReceiverUser); if (SenderUser.allianceId == ReceiverUser.allianceId) CurrentRelation = Relation.AllianceMember; //check that both are enemies (or player 0 is involved) if (receive && CurrentRelation != Relation.War && CurrentRelation != Relation.AllianceMember) { return false; } } //test that both are on the same field (if it is not scrap or recycle= if (transfer.Target > 0) { Field SenderField = null; Tuple<byte, byte> SenderSystemXY = null; if (senderShip != null) { SenderField = senderShip.field; SenderSystemXY = senderShip.getSystemCoords(); } if (senderColony != null) { SenderField = senderColony.field; SenderSystemXY = senderColony.systemXY(); } Field TargetField = null; Tuple<byte, byte> TargetSystemXY = null; if (targetShip != null) { TargetField = targetShip.field; TargetSystemXY = targetShip.getSystemCoords(); } if (targetColony != null) { TargetField = targetColony.field; TargetSystemXY = targetColony.systemXY(); } if (SenderField != TargetField) return false; if (SenderSystemXY != null && TargetSystemXY == null) return false; if (SenderSystemXY == null && TargetSystemXY != null) return false; if (SenderSystemXY != null && (SenderSystemXY.Item1 != TargetSystemXY.Item1 || SenderSystemXY.Item2 != TargetSystemXY.Item2)) return false; } //tests that all goods are in store on both sides of the transfer List<SpaceObjectStock> SenderStock = null; List<SpaceObjectStock> TargetStock = null; if (senderShip != null) SenderStock = senderShip.goods.ToList<SpaceObjectStock>(); if (targetShip != null) TargetStock = targetShip.goods.ToList<SpaceObjectStock>(); if (senderColony != null) SenderStock = senderColony.goods.ToList<SpaceObjectStock>(); if (targetColony != null) TargetStock = targetColony.goods.ToList<SpaceObjectStock>(); int TransferCapacity = 0; foreach (var transferLine in transfer.Goods){ var Good = Core.Instance.Goods[transferLine.Id]; TransferCapacity += Good.Weight() * transferLine.Qty; if (transferLine.Qty > 0) { //check that sender has it on store if (!SenderStock.Any(e => e.goodsId == transferLine.Id && e.amount >= transferLine.Qty)) return false; } else { //check that target has it on store if (!TargetStock.Any(e => e.goodsId == transferLine.Id && e.amount >= -transferLine.Qty)) return false; } } //test that scrap or recycle does not demand something in return. transfer can be sent to user 0 -> that will always be a scrap or recycle command if (receiver.GetUserId() == 0 && ( receiver.Id == 0 || receiver.Id == -1) ) { if (receive) return false; } //sender + receiver : sufficient cargoSpace if (TransferCapacity < 0) { int RemainigFreeSpace = sender.CalcStorage() - sender.AmountOnStock(); //check SenderStock: if (RemainigFreeSpace < -TransferCapacity) return false; } else { if (receiver.GetUserId() != 0) { int RemainigFreeSpace = receiver.CalcStorage() - receiver.AmountOnStock(); //check ReceiverStock: if (RemainigFreeSpace < TransferCapacity) return false; } } return true; }