Esempio n. 1
0
        public void CancelBuildingConstruction(uint garrPlotInstanceId)
        {
            GarrisonBuildingRemoved buildingRemoved = new GarrisonBuildingRemoved();

            buildingRemoved.GarrTypeID = GetGarrisonType();
            buildingRemoved.Result     = CheckBuildingRemoval(garrPlotInstanceId);
            if (buildingRemoved.Result == GarrisonError.Success)
            {
                Plot plot = GetPlot(garrPlotInstanceId);

                buildingRemoved.GarrPlotInstanceID = garrPlotInstanceId;
                buildingRemoved.GarrBuildingID     = plot.BuildingInfo.PacketInfo.Value.GarrBuildingID;

                Map map = FindMap();
                if (map)
                {
                    plot.DeleteGameObject(map);
                }

                plot.ClearBuildingInfo(GetGarrisonType(), _owner);
                _owner.SendPacket(buildingRemoved);

                GarrBuildingRecord constructing = CliDB.GarrBuildingStorage.LookupByKey(buildingRemoved.GarrBuildingID);
                // Refund construction/upgrade cost
                _owner.ModifyCurrency((CurrencyTypes)constructing.CurrencyTypeID, constructing.CurrencyQty, false, true);
                _owner.ModifyMoney(constructing.GoldCost * MoneyConstants.Gold, false);

                if (constructing.UpgradeLevel > 1)
                {
                    // Restore previous level building
                    uint restored = Global.GarrisonMgr.GetPreviousLevelBuilding(constructing.BuildingType, constructing.UpgradeLevel);
                    Cypher.Assert(restored != 0);

                    GarrisonPlaceBuildingResult placeBuildingResult = new GarrisonPlaceBuildingResult();
                    placeBuildingResult.GarrTypeID = GetGarrisonType();
                    placeBuildingResult.Result     = GarrisonError.Success;
                    placeBuildingResult.BuildingInfo.GarrPlotInstanceID = garrPlotInstanceId;
                    placeBuildingResult.BuildingInfo.GarrBuildingID     = restored;
                    placeBuildingResult.BuildingInfo.TimeBuilt          = Time.UnixTime;
                    placeBuildingResult.BuildingInfo.Active             = true;

                    plot.SetBuildingInfo(placeBuildingResult.BuildingInfo, _owner);
                    _owner.SendPacket(placeBuildingResult);
                }

                if (map)
                {
                    GameObject go = plot.CreateGameObject(map, GetFaction());
                    if (go)
                    {
                        map.AddToMap(go);
                    }
                }
            }
            else
            {
                _owner.SendPacket(buildingRemoved);
            }
        }
Esempio n. 2
0
        public void PlaceBuilding(uint garrPlotInstanceId, uint garrBuildingId)
        {
            GarrisonPlaceBuildingResult placeBuildingResult = new GarrisonPlaceBuildingResult();

            placeBuildingResult.GarrTypeID = GetGarrisonType();
            placeBuildingResult.Result     = CheckBuildingPlacement(garrPlotInstanceId, garrBuildingId);
            if (placeBuildingResult.Result == GarrisonError.Success)
            {
                placeBuildingResult.BuildingInfo.GarrPlotInstanceID = garrPlotInstanceId;
                placeBuildingResult.BuildingInfo.GarrBuildingID     = garrBuildingId;
                placeBuildingResult.BuildingInfo.TimeBuilt          = Time.UnixTime;

                Plot plot                   = GetPlot(garrPlotInstanceId);
                uint oldBuildingId          = 0;
                Map  map                    = FindMap();
                GarrBuildingRecord building = CliDB.GarrBuildingStorage.LookupByKey(garrBuildingId);
                if (map)
                {
                    plot.DeleteGameObject(map);
                }

                if (plot.BuildingInfo.PacketInfo.HasValue)
                {
                    oldBuildingId = plot.BuildingInfo.PacketInfo.Value.GarrBuildingID;
                    if (CliDB.GarrBuildingStorage.LookupByKey(oldBuildingId).BuildingType != building.BuildingType)
                    {
                        plot.ClearBuildingInfo(GetGarrisonType(), _owner);
                    }
                }

                plot.SetBuildingInfo(placeBuildingResult.BuildingInfo, _owner);
                if (map)
                {
                    GameObject go = plot.CreateGameObject(map, GetFaction());
                    if (go)
                    {
                        map.AddToMap(go);
                    }
                }

                _owner.ModifyCurrency((CurrencyTypes)building.CurrencyTypeID, -building.CurrencyQty, false, true);
                _owner.ModifyMoney(-building.GoldCost * MoneyConstants.Gold, false);

                if (oldBuildingId != 0)
                {
                    GarrisonBuildingRemoved buildingRemoved = new GarrisonBuildingRemoved();
                    buildingRemoved.GarrTypeID         = GetGarrisonType();
                    buildingRemoved.Result             = GarrisonError.Success;
                    buildingRemoved.GarrPlotInstanceID = garrPlotInstanceId;
                    buildingRemoved.GarrBuildingID     = oldBuildingId;
                    _owner.SendPacket(buildingRemoved);
                }

                _owner.UpdateCriteria(CriteriaTypes.PlaceGarrisonBuilding, garrBuildingId);
            }

            _owner.SendPacket(placeBuildingResult);
        }