Improve House system

This commit is contained in:
hydrant
2019-07-30 12:42:02 +02:00
parent f30036ca15
commit abba223f57
7 changed files with 645 additions and 619 deletions

View File

@@ -10,12 +10,7 @@ export default function house(globalData: GlobalData) {
var keyBound = false; var keyBound = false;
mp.events.add("SERVER:ShowHouseMenu", (dataStr, state: number) => { mp.events.add("SERVER:ShowHouseMenu", () => {
houseData = JSON.parse(dataStr);
houseState = state;
mp.gui.chat.push(state.toString());
mp.gui.chat.push(dataStr);
mp.game.ui.setTextComponentFormat('STRING'); mp.game.ui.setTextComponentFormat('STRING');
mp.game.ui.addTextComponentSubstringPlayerName('Drücke ~INPUT_CONTEXT~, um das Hausmenü öffnen'); mp.game.ui.addTextComponentSubstringPlayerName('Drücke ~INPUT_CONTEXT~, um das Hausmenü öffnen');
mp.game.ui.displayHelpTextFromStringLabel(0, true, true, -1); mp.game.ui.displayHelpTextFromStringLabel(0, true, true, -1);
@@ -24,13 +19,18 @@ export default function house(globalData: GlobalData) {
keyBound = true; keyBound = true;
}); });
mp.events.add("SERVER:SetHouseData", (dataStr, state) => {
houseData = JSON.parse(dataStr);
houseState = state;
});
function keyPressHandler() { function keyPressHandler() {
mp.gui.chat.push("open menu"); mp.gui.chat.push("open menu");
mp.game.ui.clearHelp(true); mp.game.ui.clearHelp(true);
var subTitle = houseData.Type; var subTitle = houseData.Type;
if (houseData.OwnerName) { if (houseData.OwnerName) {
subTitle += " von " + houseData.OwnerData; subTitle += " von " + houseData.OwnerName;
} }
houseMenu = new Menu("Hausverwaltung", subTitle, new Point(50, 50), null, null); houseMenu = new Menu("Hausverwaltung", subTitle, new Point(50, 50), null, null);
@@ -39,15 +39,14 @@ export default function house(globalData: GlobalData) {
mp.gui.chat.push(houseState.toString()); mp.gui.chat.push(houseState.toString());
var rentInItem: UIMenuItem; var rentInItem: UIMenuItem;
var cancelOwnRentalItem: UIMenuItem;
var buyHouseItem: UIMenuItem; var buyHouseItem: UIMenuItem;
var setRentalFeeItem: UIMenuItem; var setRentalFeeItem: UIMenuItem;
var cancelRentalsItem: UIMenuItem; var cancelRentalsItem: UIMenuItem;
var houseRentals = 0; var houseRentals = houseData.Rentals.length;
if (houseData.Rentals) houseRentals = houseData.Rentals.length;
if (houseState === -1) { // Keine Beziehung zum Haus if (houseState === -1) { // Keine Beziehung zum Haus
mp.gui.chat.push("einmieten"); mp.gui.chat.push("einmieten");
@@ -65,21 +64,38 @@ export default function house(globalData: GlobalData) {
setRentalFeeItem.SetRightLabel(moneyFormat(houseData.RentalFee, 0) + "$"); setRentalFeeItem.SetRightLabel(moneyFormat(houseData.RentalFee, 0) + "$");
houseMenu.AddItem(setRentalFeeItem); houseMenu.AddItem(setRentalFeeItem);
if (houseRentals > 0) {
cancelRentalsItem = new UIMenuItem("Mieter", "Liste deine Mieter auf"); cancelRentalsItem = new UIMenuItem("Mieter", "Liste deine Mieter auf");
cancelRentalsItem.SetRightLabel(houseRentals.toString()); cancelRentalsItem.SetRightLabel(houseRentals.toString());
houseMenu.AddItem(cancelRentalsItem);
if (houseRentals > 0) {
var cancelRentalsMenu = new Menu("Mieter", "Kündige einen Mieter", new Point(50, 50), null, null); var cancelRentalsMenu = new Menu("Mieter", "Kündige einen Mieter", new Point(50, 50), null, null);
cancelRentalsMenu.Visible = false; cancelRentalsMenu.Visible = false;
houseData.Rentals.forEach(rental => { houseData.Rentals.forEach(rental => {
var item = new UIMenuItem(rental.Name, ""); var item = new UIMenuItem(rental, "");
item.SetRightLabel("Kündigen"); item.SetRightLabel("Kündigen");
cancelRentalsMenu.AddItem(item); cancelRentalsMenu.AddItem(item);
}); });
cancelRentalsMenu.ItemSelect.on((item: UIMenuItem, index: number) => {
mp.events.callRemote("CLIENT:House_CancelUserRental", item.Text);
houseRentals--;
cancelRentalsItem.SetRightLabel(houseRentals.toString());
if (houseRentals === 0) {
cancelRentalsMenu.Visible = false;
houseMenu.Visible = true;
houseMenu.RemoveItem(cancelRentalsItem);
}
cancelRentalsMenu.RemoveItem(item);
});
houseMenu.BindMenuToItem(cancelRentalsMenu, cancelRentalsItem); houseMenu.BindMenuToItem(cancelRentalsMenu, cancelRentalsItem);
} }
} else if (houseState === 2) {
cancelOwnRentalItem = new UIMenuItem("Mietvertrag kündigen", "Ziehe aus der Wohnung aus");
houseMenu.AddItem(cancelOwnRentalItem);
} }
var cancelItem = new UIMenuItem("Abbrechen"); var cancelItem = new UIMenuItem("Abbrechen");
@@ -97,6 +113,7 @@ export default function house(globalData: GlobalData) {
mp.events.call("SERVER:CloseHouseMenu"); mp.events.call("SERVER:CloseHouseMenu");
} else if (item === setRentalFeeItem) { } else if (item === setRentalFeeItem) {
var rentalFeeInput = new InputHelper("Wie viel soll die Miete betragen?", globalData); var rentalFeeInput = new InputHelper("Wie viel soll die Miete betragen?", globalData);
rentalFeeInput.show();
rentalFeeInput.getValue(data => { rentalFeeInput.getValue(data => {
if (isNaN(data)) { if (isNaN(data)) {
return; return;
@@ -107,13 +124,20 @@ export default function house(globalData: GlobalData) {
mp.events.callRemote("CLIENT:House_SetRentalFee", rentalFee); mp.events.callRemote("CLIENT:House_SetRentalFee", rentalFee);
mp.events.call("SERVER:CloseHouseMenu"); mp.events.call("SERVER:CloseHouseMenu");
}); });
} else if (item === rentInItem) {
mp.events.callRemote("CLIENT:House_RentInHouse");
} else if (item === cancelOwnRentalItem) {
mp.events.callRemote("CLIENT:House_CancelOwnRental");
} }
}); });
houseMenu.MenuClose.on(() => {
globalData.InMenu = false;
});
} }
mp.events.add("SERVER:CloseHouseMenu", () => { mp.events.add("SERVER:CloseHouseMenu", () => {
mp.game.ui.clearHelp(true); mp.game.ui.clearHelp(true);
globalData.InMenu = false;
if (houseMenu != null) { if (houseMenu != null) {
houseMenu.Close(); houseMenu.Close();
} }

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +1,18 @@
{ {
"name": "reallifegamemode.client", "name": "client",
"version": "1.0.0", "version": "1.0.0",
"devDependencies": { "devDependencies": {
"@babel/core": "^7.3.4", "@babel/core": "^7.5.5",
"@types/node": "^11.9.5", "@types/node": "^11.13.18",
"@types/ragemp-c": "github:CocaColaBear/types-ragemp-c#master", "@types/ragemp-c": "github:CocaColaBear/types-ragemp-c#master",
"NativeUI": "https://github.com/sprayzcs/RageMP-NativeUI/tarball/master", "NativeUI": "git+ssh://git@github.com/sprayzcs/RageMP-NativeUI.git",
"babel-loader": "^8.0.5", "babel-loader": "^8.0.6",
"copy-webpack-plugin": "^5.0.1", "copy-webpack-plugin": "^5.0.4",
"ts-loader": "^5.3.3", "ts-loader": "^5.4.5",
"typescript": "^3.3.3333", "typescript": "^3.5.3",
"uglifyjs-webpack-plugin": "^2.1.2", "uglifyjs-webpack-plugin": "^2.1.3",
"webpack": "^4.29.6", "webpack": "^4.38.0",
"webpack-cli": "^3.2.3" "webpack-cli": "^3.3.6"
}, },
"scripts": { "scripts": {
"watch": "webpack --watch --config webpack.config.development.js", "watch": "webpack --watch --config webpack.config.development.js",

View File

@@ -13,13 +13,12 @@
}, },
"include": [ "include": [
"**/*", "**/*",
"node_modules/NativeUI/index.ts", "../ReallifeGamemode.Server/Entities/FactionWeapon.cs" "node_modules/NativeUI/index.ts"
], ],
"files": [ "files": [
"node_modules/NativeUI/index.ts" "node_modules/NativeUI/index.ts"
], ],
"exclude": [ "exclude": [
"node_modules", "node_modules"
"wwwroot"
] ]
} }

View File

@@ -6,7 +6,7 @@ using System.Text;
namespace ReallifeGamemode.Server.Entities namespace ReallifeGamemode.Server.Entities
{ {
public class HouseRentals public class HouseRental
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

View File

@@ -48,12 +48,12 @@ namespace ReallifeGamemode.Server.Managers
{ {
using (dbContext = new DatabaseContext()) using (dbContext = new DatabaseContext())
{ {
return dbContext.Houses.Where(h => h.Position.DistanceTo(position) <= 5f).OrderBy(h => h.Position.DistanceTo(position)).FirstOrDefault(); return dbContext.Houses.Where(h => h.Position.DistanceTo(position) <= 5f).Include(h => h.Owner).OrderBy(h => h.Position.DistanceTo(position)).FirstOrDefault();
} }
} }
else else
{ {
return dbContext.Houses.Where(h => h.Position.DistanceTo(position) <= 5f).OrderBy(h => h.Position.DistanceTo(position)).FirstOrDefault(); return dbContext.Houses.Where(h => h.Position.DistanceTo(position) <= 5f).Include(h => h.Owner).OrderBy(h => h.Position.DistanceTo(position)).FirstOrDefault();
} }
} }
@@ -129,14 +129,22 @@ namespace ReallifeGamemode.Server.Managers
House house = GetHouseById(houseId); House house = GetHouseById(houseId);
User user = client.GetUser(); User user = client.GetUser();
var userHouseStatus = -1; client.SendChatMessage("SERVER:ShowHouseMenu");
SendClientHouseData(client, house);
}
private static void SendClientHouseData(Client player, House house)
{
User user = player.GetUser();
var userHouseStatus = -1;
using (var dbContext = new DatabaseContext()) using (var dbContext = new DatabaseContext())
{ {
if (house.OwnerId == null) userHouseStatus = 0; if (house.OwnerId == null) userHouseStatus = 0;
else if (house.OwnerId == user?.Id) userHouseStatus = 1; else if (house.OwnerId == user?.Id) userHouseStatus = 1;
else if (dbContext.HouseRentals.Where(h => h.HouseId == houseId && h.UserId == user.Id).Count() == 1) userHouseStatus = 2; else if (dbContext.HouseRentals.Where(h => h.HouseId == house.Id && h.UserId == user.Id).Count() == 1) userHouseStatus = 2;
var rentals = dbContext.HouseRentals.Where(h => h.HouseId == house.Id).Include(h => h.User).Select(h => h.User.Name).ToList();
var newHouse = new var newHouse = new
{ {
@@ -144,13 +152,10 @@ namespace ReallifeGamemode.Server.Managers
house.RentalFee, house.RentalFee,
house.Price, house.Price,
house.Type, house.Type,
Rentals = dbContext.HouseRentals.Where(h => h.Id == houseId).Include(h => h.UserId).Select(h => new Rentals = rentals
{
h.User.Name
}).ToList()
}; };
client.TriggerEvent("SERVER:ShowHouseMenu", JsonConvert.SerializeObject(newHouse), userHouseStatus); player.TriggerEvent("SERVER:SetHouseData", JsonConvert.SerializeObject(newHouse), userHouseStatus);
} }
} }
@@ -227,9 +232,118 @@ namespace ReallifeGamemode.Server.Managers
house.RentalFee = rentalFee; house.RentalFee = rentalFee;
dbContext.SaveChanges();
player.SendNotification($"Der Mietpreis wurde auf ~g~{rentalFee.ToMoneyString()}~s~ gesetzt"); player.SendNotification($"Der Mietpreis wurde auf ~g~{rentalFee.ToMoneyString()}~s~ gesetzt");
RemoveHouse(house);
LoadHouse(house);
}
}
[RemoteEvent("CLIENT:House_CancelUserRental")]
public void HouseManagerCancelUserRentalEvent(Client player, string userName)
{
using (var dbContext = new DatabaseContext())
{
User user = player.GetUser(dbContext);
if (user.HouseId == null)
{
ChatService.ErrorMessage(player, "Du besitzt kein Haus");
return;
}
User target = dbContext.Users.Where(u => u.Name == userName).FirstOrDefault();
if (target == null)
{
player.SendNotification("~r~Dieser Spieler wurde nicht gefunden.");
return;
}
House house = GetHouseById(user.HouseId.Value, dbContext);
if (user.HouseId == null)
{
ChatService.ErrorMessage(player, "Du besitzt kein Haus");
return;
}
HouseRental rental = dbContext.HouseRentals.Where(h => h.HouseId == house.Id && h.UserId == target.Id).FirstOrDefault();
if (rental == null)
{
player.SendNotification("~r~Der Spieler ist nicht in deinem Haus eingemietet");
return;
}
dbContext.HouseRentals.Remove(rental);
dbContext.SaveChanges(); dbContext.SaveChanges();
player.SendNotification("Du hast dem Spieler ~y~" + target.Name + "~s~ den Mietvertrag gekündigt.");
SendClientHouseData(player, house);
}
}
[RemoteEvent("CLIENT:House_RentInHouse")]
public void HouseManagerRentInHouseEvent(Client player)
{
using (var dbContext = new DatabaseContext())
{
User user = player.GetUser(dbContext);
House house = GetNearHouse(player.Position, dbContext);
if (house == null)
{
ChatService.ErrorMessage(player, "In deiner Nähe ist kein Haus");
return;
}
HouseRental newRental = new HouseRental
{
HouseId = house.Id,
UserId = user.Id
};
dbContext.HouseRentals.Add(newRental);
dbContext.SaveChanges();
player.SendNotification("~g~Du hast dich in das Haus eingemietet");
house.User?.SendNotification($"~y~{player.Name}~s~ hat sich in dein Haus eingemietet.");
SendClientHouseData(player, house);
}
}
[RemoteEvent("CLIENT:House_CancelOwnRental")]
public void HouseManagerCancelOwnRentalEvent(Client player)
{
using (var dbContext = new DatabaseContext())
{
User user = player.GetUser(dbContext);
House house = GetNearHouse(player.Position, dbContext);
if (house == null)
{
ChatService.ErrorMessage(player, "In deiner Nähe ist kein Haus");
return;
}
HouseRental rental = dbContext.HouseRentals.Where(h => h.HouseId == house.Id && h.UserId == user.Id).FirstOrDefault();
if (rental == null)
{
player.SendNotification("~r~Du bist nin diesem Haus nicht eingemietet");
return;
}
dbContext.HouseRentals.Remove(rental);
dbContext.SaveChanges();
player.SendNotification("~g~Du hast den Mietvertrag gekündigt.");
house.User?.SendNotification($"~y~{player.Name}~s~ hat seinen Mietvertrag gekündigt.");
SendClientHouseData(player, house);
} }
} }
} }

View File

@@ -106,7 +106,7 @@ namespace ReallifeGamemode.Server.Models
// Houses // Houses
public DbSet<Entities.House> Houses { get; set; } public DbSet<Entities.House> Houses { get; set; }
public DbSet<Entities.HouseRentals> HouseRentals { get; set; } public DbSet<Entities.HouseRental> HouseRentals { get; set; }
// Bus Routes // Bus Routes
public DbSet<Entities.BusRoute> BusRoutes { get; set; } public DbSet<Entities.BusRoute> BusRoutes { get; set; }