From fbf491c80db83ae5367fa5d4654a6ec057ac68b6 Mon Sep 17 00:00:00 2001 From: Bence <78733248+BXn4@users.noreply.github.com> Date: Tue, 24 Sep 2024 09:08:44 +0200 Subject: [PATCH 1/8] Added gifts feature Gifts not yet saved in the db --- commands/gmg.py | 17 +++++++++++ commands/grm.py | 19 ++++++++++++ commands/gus.py | 77 +++++++++++++++++++++++++++++++++++++++++++++++ consts.py | 4 +++ objects/player.py | 32 +++++++++++++++++--- 5 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 commands/gmg.py create mode 100644 commands/grm.py create mode 100644 commands/gus.py diff --git a/commands/gmg.py b/commands/gmg.py new file mode 100644 index 0000000..e76e552 --- /dev/null +++ b/commands/gmg.py @@ -0,0 +1,17 @@ +from response import ExtensionResponse +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from server import CafeServer + from asyncio import StreamWriter + + +async def handle_gmg(server: 'CafeServer', client: 'StreamWriter', *params: str): + address = client.get_extra_info('peername') + player = server.clients[address] + + response = ExtensionResponse('gmg', '-1', '0', player.build_gifts()) + + # print(player.build_gifts()) + + await server.send_response(client, response) diff --git a/commands/grm.py b/commands/grm.py new file mode 100644 index 0000000..aa346e1 --- /dev/null +++ b/commands/grm.py @@ -0,0 +1,19 @@ +from response import ExtensionResponse +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from server import CafeServer + from asyncio import StreamWriter + + +async def handle_grm(server: 'CafeServer', client: 'StreamWriter', *params: str): + address = client.get_extra_info('peername') + player = server.clients[address] + + slot = int(params[1]) + + player.remove_gift(slot) + + response = ExtensionResponse('grm', '-1', '0', str(slot)) + + await server.send_response(client, response) diff --git a/commands/gus.py b/commands/gus.py new file mode 100644 index 0000000..f38aedb --- /dev/null +++ b/commands/gus.py @@ -0,0 +1,77 @@ +from consts import INGREDIENT_IDs, DISH_IDs, FANCY_IDs +from objects.cafe_object import ObjectType +from response import ExtensionResponse +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from server import CafeServer + from asyncio import StreamWriter + + +async def handle_gus(server: 'CafeServer', client: 'StreamWriter', *params: str): + address = client.get_extra_info('peername') + player = server.clients[address] + + slot = int(params[1]) + gift_details = player.gifts[slot] + item, amount, sender, received = gift_details + + match item: + case _ if item in INGREDIENT_IDs or item == 1450: + fridge_capacity = player.cafe.get_fridge_capacity() + fridge_inventory = player.cafe.fridge_inventory + fridge_space = sum( + item_amount for item_id, item_amount in fridge_inventory.items() if item_id not in FANCY_IDs) + free_space = fridge_capacity - fridge_space + + if free_space < amount: + response = ExtensionResponse('gus', '-1', '40') + await server.send_response(client, response) + return + + else: + if item not in player.cafe.fridge_inventory: + player.cafe.fridge_inventory[item] = amount + else: + player.cafe.fridge_inventory[item] += amount + + response = ExtensionResponse('gus', '-1', '0', str(slot), str(item), str(amount)) + await server.send_response(client, response) + player.remove_gift(slot) + return + + case _ if item in FANCY_IDs: + # Fancy does not take space in the fridge. + if item not in player.cafe.fridge_inventory: + player.cafe.fridge_inventory[item] = amount + else: + player.cafe.fridge_inventory[item] += amount + + response = ExtensionResponse('gus', '-1', '0', str(slot), str(item), str(amount)) + await server.send_response(client, response) + + player.remove_gift(slot) + return + + case _ if item in DISH_IDs: + counter = next( + (obj for obj in player.cafe.objects if obj.type == ObjectType.COUNTER and obj.dish_id == item), + None + ) or next( + (obj for obj in player.cafe.objects if obj.type == ObjectType.COUNTER and obj.dish_id == -1), + None + ) + + if counter: + counter.dish_id = item + counter.dish_amount = amount + + response = ExtensionResponse('gus', '-1', '0', str(slot), str(item), str(amount), + str(counter.pos[0]), str(counter.pos[1])) + await server.send_response(client, response) + + player.remove_gift(slot) + else: + response = ExtensionResponse('gus', '-1', '20') + await server.send_response(client, response) + return diff --git a/consts.py b/consts.py index 39deadc..81489e0 100644 --- a/consts.py +++ b/consts.py @@ -9,3 +9,7 @@ FRIDGE_IDs = tuple(range(351, 359)) FANCY_IDs = tuple(range(1401, 1410)) +INGREDIENT_IDs = tuple(range(1301, 1344)) + +BASIC_DECOR_IDs = tuple(range(501, 510)) +DISH_IDs = tuple(range(1201, 1256)) \ No newline at end of file diff --git a/objects/player.py b/objects/player.py index 277f733..50a477f 100644 --- a/objects/player.py +++ b/objects/player.py @@ -5,7 +5,6 @@ if TYPE_CHECKING: from objects.cafe import Cafe - from asyncio import Task class Player: @@ -30,8 +29,7 @@ def __init__(self): self.pos = None self.mastery: dict[int, int] = {num: 0 for num in range(1201, 1256)} - - self.customer_cycle: Optional['Task'] = None + self.gifts: dict[int, tuple[int, int, int, str]] = {} # [SLOT] -> (ID, AMOUNT, SENDER, RECEIVED) def build_mastery(self) -> str: pairs = [] @@ -95,9 +93,35 @@ def get_mastery_duration(self, item_id: int) -> int: else: return floor(duration * 0.95) * 60 + def parse_gifts(self, gift_values: str) -> None: + pairs = gift_values.split('#') + for pair in pairs: + if not pair: + continue + slot, item, amount, sender, received = pair.split('+') + self.gifts[int(slot)] = (int(item), int(amount), sender, received) + + def build_gifts(self) -> str: + pairs = [] + for slot, (item, amount, sender, received) in self.gifts.items(): + pairs.append(f'{slot}+{item}+{amount}+{sender}+{received}') + + return '#'.join(pairs) + + def add_gift(self, item, amount, sender, received): + next_slot = len(self.gifts) + self.gifts[next_slot] = (item, amount, sender, received) + + def remove_gift(self, slot: int): + for index, (item, details) in enumerate(self.gifts.items(), start=0): + if index == slot: + self.gifts.pop(item) + break + def to_response(self, *params: str) -> list[str]: return [ - *params, str(self.id), str(self.id), '0', str(self.cash), str(self.gold), str(self.xp), str(self.instant_cookings), + *params, str(self.id), str(self.id), '0', str(self.cash), str(self.gold), str(self.xp), + str(self.instant_cookings), str(self.open_jobs), '0', str(int(self.played_wheel)), '0', str(int(self.allow_friend_requests)), str(int(self.allow_emails)), str(int(self.email_verified)), str(self.new_gifts), self.avatar.to_string() ] From a1af04c32dc01ff6d1141f4e1d33c4eefe74a514 Mon Sep 17 00:00:00 2001 From: Bence <78733248+BXn4@users.noreply.github.com> Date: Tue, 24 Sep 2024 09:11:00 +0200 Subject: [PATCH 2/8] Added fortune wheel minigame Not yet saved to the db --- commands/mwf.py | 192 ++++++++++++++++++++++++++++++++++++++++++++++ objects/player.py | 5 ++ server.py | 5 +- 3 files changed, 200 insertions(+), 2 deletions(-) create mode 100644 commands/mwf.py diff --git a/commands/mwf.py b/commands/mwf.py new file mode 100644 index 0000000..47c6f62 --- /dev/null +++ b/commands/mwf.py @@ -0,0 +1,192 @@ +from datetime import datetime, timezone +from math import floor +from random import randint, randrange, choice, sample + +from consts import BASIC_DECOR_IDs, FANCY_IDs, DISH_IDs, INGREDIENT_IDs +from response import ExtensionResponse +from typing import TYPE_CHECKING, Tuple + +from utils import items + +if TYPE_CHECKING: + from server import CafeServer + from asyncio import StreamWriter + + +class Rewards: + MOREGOLD = 0 + CASH: Tuple[int, int] = (1, 9) + RAREINGREDIENT: Tuple[int, int] = (2, 13) + DECOR = 3 + FANCY: Tuple[int, int] = (4, 11) + DISH: Tuple[int, int, int] = (5, 7, 15) + XP: Tuple[int, int] = (6, 14) + GOLD = 8 + INGREDIENT = 10 + RAREDECO = 12 + + +async def handle_mwf(server: 'CafeServer', client: 'StreamWriter', *params: str): + address = client.get_extra_info('peername') + player = server.clients[address] + + if player.new_gifts < 99: # Max gifts 99 + if player.played_wheel: + if player.gold > 0: + await handle_spin(server, client, player) + return + else: + response = ExtensionResponse('mwf', '-1', '4') + await server.send_response(client, response) + return + else: + player.played_wheel = True + server.db.update_player(player.id, played_wheel=1) + await handle_spin(server, client, player) + else: + response = ExtensionResponse('mwf', '-1', '92') + await server.send_response(client, response) + + +async def handle_spin(server, client, player): + reward = randint(0, 15) + player_level = player.get_level() + + match reward: + case Rewards.MOREGOLD: + # amount = randint(5, 10) + player.gold += 10 + + response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'1902+{10}') + await server.send_response(client, response) + + # await server.db.update_player(player.id, gold=player.gold) + + case reward if reward in Rewards.CASH: + amount = floor(randrange(300, 401, 5) * (player_level * 1.2)) + player.cash += amount + + response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'1901+{amount}') + await server.send_response(client, response) + # await server.db.update_player(player.id, cash=player.cash) + + case reward if reward in Rewards.RAREINGREDIENT: + player.add_gift(1450, 1, -1, datetime.now(timezone.utc).timestamp()) + + response = ExtensionResponse('mwf', '-1', '0', f'{reward}', '1450+1') + await server.send_response(client, response) + + case Rewards.DECOR: + won_decor = choice(BASIC_DECOR_IDs) + + if won_decor not in player.cafe.furniture_inventory: + player.cafe.furniture_inventory[won_decor] = 1 + else: + player.cafe.furniture_inventory[won_decor] += 1 + + response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'{won_decor}+1') + await server.send_response(client, response) + + case reward if reward in Rewards.FANCY: + if player.new_gifts == 97: + random_fancy_types = randint(1, 2) + elif player.new_gifts == 98: + random_fancy_types = 1 + else: + random_fancy_types = randint(1, 3) + + won_fancy = sample(FANCY_IDs, random_fancy_types) + won_fancys_str = "" + + for fancy_id in won_fancy: + amount = randint(1, 10) + won_fancys_str += f'{fancy_id}+{amount}#' + + player.add_gift(fancy_id, amount, -1, datetime.now(timezone.utc).timestamp()) + + response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'{won_fancys_str}') + await server.send_response(client, response) + + case reward if reward in Rewards.DISH: + available_dishes = [] + + if player.new_gifts == 97: + random_dishes = randint(1, 2) + elif player.new_gifts == 98: + random_dishes = 1 + else: + random_dishes = randint(1, 3) + + for dish_id in DISH_IDs: + dish = items.get_dish_info(dish_id) + if dish['level'] <= player_level: + if dish['events'] == 0 or dish['events'] == server.current_event: + available_dishes.append(dish_id) + + won_dishes = sample(available_dishes, random_dishes) + won_dish_str = "" + + for dish_id in won_dishes: + if dish_id == 1255: # OMELETTE + amount = randint(1, 3) * 10 + else: + amount = randint(1, 9) * 10 + + won_dish_str += f'{dish_id}+{amount}#' + + player.add_gift(dish_id, amount, -1, datetime.now(timezone.utc).timestamp()) + + response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'{won_dish_str}') + await server.send_response(client, response) + + case reward if reward in Rewards.XP: + amount = randint(60, 150) * player_level + + response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'1905+{amount}') + await server.send_response(client, response) + + case Rewards.GOLD: + won_gold = randint(1, 5) + player.gold += won_gold + + response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'1902+{won_gold}') + await server.send_response(client, response) + + case Rewards.INGREDIENT: + available_ingredients = [] + + if player.new_gifts == 97: + random_ingredients = randint(1, 2) + elif player.new_gifts == 98: + random_ingredients = 1 + else: + random_ingredients = randint(1, 3) + + for ingredient_id in INGREDIENT_IDs: + ingredient = items.get_ingredient(ingredient_id) + if ingredient['level'] <= player_level: + if ingredient['events'] == 0 or ingredient['events'] == server.current_event: + available_ingredients.append(ingredient_id) + + won_ingredient = sample(available_ingredients, random_ingredients) + won_ingredient_str = '' + + for ingredient_id in won_ingredient: + amount = randint(1, 20) + won_ingredient_str += f'{ingredient_id}+{amount}#' + + player.add_gift(ingredient_id, amount, -1, datetime.now(timezone.utc).timestamp()) + + response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'{won_ingredient_str}') + await server.send_response(client, response) + + case Rewards.RAREDECO: + won_decor = 510 + + if won_decor not in player.cafe.furniture_inventory: + player.cafe.furniture_inventory[won_decor] = 1 + else: + player.cafe.furniture_inventory[won_decor] += 1 + + response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'{won_decor}+1') + await server.send_response(client, response) diff --git a/objects/player.py b/objects/player.py index 50a477f..de1f42d 100644 --- a/objects/player.py +++ b/objects/player.py @@ -118,6 +118,11 @@ def remove_gift(self, slot: int): self.gifts.pop(item) break + def get_level(self) -> int: + if self.xp < 90: + return floor(pow(floor(self.xp / 10), 1 / 2)) + return floor(pow(floor(self.xp / 5), 1 / 3.72)) + def to_response(self, *params: str) -> list[str]: return [ *params, str(self.id), str(self.id), '0', str(self.cash), str(self.gold), str(self.xp), diff --git a/server.py b/server.py index 0086471..eae33e5 100644 --- a/server.py +++ b/server.py @@ -32,13 +32,14 @@ def __init__(self) -> None: self.db = Database() self.marketplace = Cafe.get_marketplace() + self.current_event: int = 0 @staticmethod async def send_response(connection, response: Response): response = response.raw_response connection.write(response.encode()) await connection.drain() - print('[SENT] {}'.format(response.strip('\x00'))) + # print('[SENT] {}'.format(response.strip('\x00'))) def bind_socket(self) -> None: try: @@ -65,7 +66,7 @@ async def handle_client(self, reader: asyncio.StreamReader, writer: asyncio.Stre request = Request(request_str.strip('\x00')) - print(f'\n[RECEIVED] {request.raw_request}') + # print(f'\n[RECEIVED] {request.raw_request}') if request.type == RequestType.DISCONNECT: writer.close() From b86e6122fd95b8b2c7e2cd1aa4367e0aa282ac54 Mon Sep 17 00:00:00 2001 From: Bence <78733248+BXn4@users.noreply.github.com> Date: Tue, 24 Sep 2024 09:11:39 +0200 Subject: [PATCH 3/8] Updated items.py --- utils/items.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/utils/items.py b/utils/items.py index 9776d33..511f8ff 100644 --- a/utils/items.py +++ b/utils/items.py @@ -38,7 +38,8 @@ def get_dish_info(dish_id: int) -> dict: 'ingredients': ingredients, 'duration': int(wod.attrib.get('duration', 0)), 'amount': int(wod.attrib.get('servings', 0)), - 'xp': int(wod.attrib.get('xp', 0)), + 'level': int(wod.attrib.get('level', 0)), + 'events': int(wod.attrib.get('events', 0)) } return {} @@ -56,3 +57,17 @@ def get_expansion(exp_id: int) -> dict: } return {} + + +def get_ingredient(ing_id: int) -> dict: + root = tree.getroot() + + for wod in root.findall('wod'): + if int(wod.attrib.get('id')) == ing_id: + return { + 'level': int(wod.attrib.get('level', 0)), + 'gold': int(wod.attrib.get('gold', 0)), + 'events': int(wod.attrib.get('events', 0)), + } + + return {} From 875626cfafcfe7eb86075251d2f9a28e88614924 Mon Sep 17 00:00:00 2001 From: Bence <78733248+BXn4@users.noreply.github.com> Date: Tue, 24 Sep 2024 10:52:41 +0200 Subject: [PATCH 4/8] [MAJOR] Set counter dish amount to 0 on clear It was not set to 0, so its means the server will update the the new dish amount to the old one --- commands/ccn.py | 1 + 1 file changed, 1 insertion(+) diff --git a/commands/ccn.py b/commands/ccn.py index f71eb5f..90cfbc1 100644 --- a/commands/ccn.py +++ b/commands/ccn.py @@ -28,6 +28,7 @@ async def handle_ccn(server: 'CafeServer', client: 'StreamWriter', *params: str) else: status = '0' obj.dish_id = -1 + obj.dish_amount = 0 server.db.update_cafe(player.id, objects=player.cafe.get_objects_as_json()) response = ExtensionResponse('ccn', '-1', status, obj_x, obj_y, str(int(obj.type == ObjectType.STOVE))) From a5b73d9c2ecaa7765cb5611d2eb74f40edc6efe8 Mon Sep 17 00:00:00 2001 From: Bence <78733248+BXn4@users.noreply.github.com> Date: Tue, 24 Sep 2024 10:56:30 +0200 Subject: [PATCH 5/8] Save gifts and fortune wheel to database --- commands/grm.py | 4 ++++ commands/gus.py | 21 ++++++++++++++++++++- commands/mwf.py | 36 +++++++++++++++++++++++++++++++++--- database.py | 7 ++++--- objects/player.py | 32 +++++++++++++++++++++++++------- 5 files changed, 86 insertions(+), 14 deletions(-) diff --git a/commands/grm.py b/commands/grm.py index aa346e1..8ade1af 100644 --- a/commands/grm.py +++ b/commands/grm.py @@ -14,6 +14,10 @@ async def handle_grm(server: 'CafeServer', client: 'StreamWriter', *params: str) player.remove_gift(slot) + player.new_gifts = len(player.gifts) + response = ExtensionResponse('grm', '-1', '0', str(slot)) await server.send_response(client, response) + + server.db.update_player(player.id, gifts=player.get_gifts_as_json(), new_gifts=player.new_gifts) diff --git a/commands/gus.py b/commands/gus.py index f38aedb..714ae87 100644 --- a/commands/gus.py +++ b/commands/gus.py @@ -38,6 +38,11 @@ async def handle_gus(server: 'CafeServer', client: 'StreamWriter', *params: str) response = ExtensionResponse('gus', '-1', '0', str(slot), str(item), str(amount)) await server.send_response(client, response) player.remove_gift(slot) + + player.new_gifts -= 1 + + server.db.update_player(player.id, gifts=player.get_gifts_as_json(), new_gifts=player.new_gifts) + server.db.update_cafe(player.id, fridge_inv=player.cafe.build_fridge_inventory()) return case _ if item in FANCY_IDs: @@ -51,6 +56,11 @@ async def handle_gus(server: 'CafeServer', client: 'StreamWriter', *params: str) await server.send_response(client, response) player.remove_gift(slot) + + player.new_gifts -= 1 + + server.db.update_player(player.id, gifts=player.get_gifts_as_json(), new_gifts=player.new_gifts) + server.db.update_cafe(player.id, fridge_inv=player.cafe.build_fridge_inventory()) return case _ if item in DISH_IDs: @@ -64,14 +74,23 @@ async def handle_gus(server: 'CafeServer', client: 'StreamWriter', *params: str) if counter: counter.dish_id = item - counter.dish_amount = amount + counter.dish_amount += amount response = ExtensionResponse('gus', '-1', '0', str(slot), str(item), str(amount), str(counter.pos[0]), str(counter.pos[1])) await server.send_response(client, response) player.remove_gift(slot) + + player.new_gifts -= 1 + + server.db.update_player(player.id, gifts=player.get_gifts_as_json(), new_gifts=player.new_gifts) + server.db.update_cafe(player.id, objects=player.cafe.get_objects_as_json()) else: response = ExtensionResponse('gus', '-1', '20') await server.send_response(client, response) return + + case _: + response = ExtensionResponse('gus', '-1', '-1') + await server.send_response(client, response) diff --git a/commands/mwf.py b/commands/mwf.py index 47c6f62..570e708 100644 --- a/commands/mwf.py +++ b/commands/mwf.py @@ -33,6 +33,10 @@ async def handle_mwf(server: 'CafeServer', client: 'StreamWriter', *params: str) if player.new_gifts < 99: # Max gifts 99 if player.played_wheel: if player.gold > 0: + player.gold -= 1 + + server.db.update_player(player.id, gold=player.gold) + await handle_spin(server, client, player) return else: @@ -57,10 +61,10 @@ async def handle_spin(server, client, player): # amount = randint(5, 10) player.gold += 10 - response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'1902+{10}') + response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'1902+10') await server.send_response(client, response) - # await server.db.update_player(player.id, gold=player.gold) + server.db.update_player(player.id, gold=player.gold) case reward if reward in Rewards.CASH: amount = floor(randrange(300, 401, 5) * (player_level * 1.2)) @@ -68,7 +72,8 @@ async def handle_spin(server, client, player): response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'1901+{amount}') await server.send_response(client, response) - # await server.db.update_player(player.id, cash=player.cash) + + server.db.update_player(player.id, cash=player.cash) case reward if reward in Rewards.RAREINGREDIENT: player.add_gift(1450, 1, -1, datetime.now(timezone.utc).timestamp()) @@ -76,6 +81,10 @@ async def handle_spin(server, client, player): response = ExtensionResponse('mwf', '-1', '0', f'{reward}', '1450+1') await server.send_response(client, response) + player.new_gifts = len(player.gifts) + + server.db.update_player(player.id, gifts=player.get_gifts_as_json(), new_gifts=player.new_gifts) + case Rewards.DECOR: won_decor = choice(BASIC_DECOR_IDs) @@ -87,6 +96,8 @@ async def handle_spin(server, client, player): response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'{won_decor}+1') await server.send_response(client, response) + server.db.update_cafe(player.id, furniture_inv=player.cafe.build_furniture_inventory()) + case reward if reward in Rewards.FANCY: if player.new_gifts == 97: random_fancy_types = randint(1, 2) @@ -107,6 +118,10 @@ async def handle_spin(server, client, player): response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'{won_fancys_str}') await server.send_response(client, response) + player.new_gifts = len(player.gifts) + + server.db.update_player(player.id, gifts=player.get_gifts_as_json(), new_gifts=player.new_gifts) + case reward if reward in Rewards.DISH: available_dishes = [] @@ -139,12 +154,19 @@ async def handle_spin(server, client, player): response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'{won_dish_str}') await server.send_response(client, response) + player.new_gifts = len(player.gifts) + + server.db.update_player(player.id, gifts=player.get_gifts_as_json(), new_gifts=player.new_gifts) + case reward if reward in Rewards.XP: amount = randint(60, 150) * player_level + player.xp += amount response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'1905+{amount}') await server.send_response(client, response) + server.db.update_player(player.id, xp=player.xp) + case Rewards.GOLD: won_gold = randint(1, 5) player.gold += won_gold @@ -152,6 +174,8 @@ async def handle_spin(server, client, player): response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'1902+{won_gold}') await server.send_response(client, response) + server.db.update_player(player.id, gold=player.gold) + case Rewards.INGREDIENT: available_ingredients = [] @@ -180,6 +204,10 @@ async def handle_spin(server, client, player): response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'{won_ingredient_str}') await server.send_response(client, response) + player.new_gifts = len(player.gifts) + + server.db.update_player(player.id, gifts=player.get_gifts_as_json(), new_gifts=player.new_gifts) + case Rewards.RAREDECO: won_decor = 510 @@ -190,3 +218,5 @@ async def handle_spin(server, client, player): response = ExtensionResponse('mwf', '-1', '0', f'{reward}', f'{won_decor}+1') await server.send_response(client, response) + + server.db.update_cafe(player.id, furniture_inv=player.cafe.build_furniture_inventory()) diff --git a/database.py b/database.py index c18e6e3..8ae669e 100644 --- a/database.py +++ b/database.py @@ -10,7 +10,7 @@ def __init__(self): try: conn = mariadb.connect( user="root", - password="", + password="1234", host="localhost", port=3306, database="gg_cafe", @@ -41,6 +41,7 @@ def _create_player_by_params(self, player_args: tuple[int, str]) -> Player: player_args[16]) player.cafe = self.get_cafe(player_args[0]) player.parse_mastery(player_args[17]) + player.set_gifts_from_json(player_args[18]) return player @@ -76,13 +77,13 @@ def try_login(self, name_or_email: str, password: str) -> tuple[int, str]: return 0, values[2] def get_player(self, username: str) -> Player: - self.cursor.execute("SELECT id, cash, gold, xp ,instant_cookings, open_jobs, played_wheel, allow_friend_requests, allow_emails, email_verified, new_gifts, username, gender, skin_color, top_color, hair_color, legs_color, mastery FROM player WHERE username=?", (username,)) + self.cursor.execute("SELECT id, cash, gold, xp ,instant_cookings, open_jobs, played_wheel, allow_friend_requests, allow_emails, email_verified, new_gifts, username, gender, skin_color, top_color, hair_color, legs_color, mastery, gifts FROM player WHERE username=?", (username,)) player_args = self.cursor.fetchone() return self._create_player_by_params(player_args) def get_player_by_id(self, player_id: int) -> Player: - self.cursor.execute("SELECT id, cash, gold, xp ,instant_cookings, open_jobs, played_wheel, allow_friend_requests, allow_emails, email_verified, new_gifts, username, gender, skin_color, top_color, hair_color, legs_color, mastery FROM player WHERE id=?", (player_id,)) + self.cursor.execute("SELECT id, cash, gold, xp ,instant_cookings, open_jobs, played_wheel, allow_friend_requests, allow_emails, email_verified, new_gifts, username, gender, skin_color, top_color, hair_color, legs_color, mastery, gifts FROM player WHERE id=?", (player_id,)) player_args = self.cursor.fetchone() return self._create_player_by_params(player_args) diff --git a/objects/player.py b/objects/player.py index de1f42d..9a6b4c2 100644 --- a/objects/player.py +++ b/objects/player.py @@ -1,3 +1,5 @@ +import json + from objects.avatar import Avatar from utils.items import get_dish_info from math import ceil, floor @@ -93,13 +95,29 @@ def get_mastery_duration(self, item_id: int) -> int: else: return floor(duration * 0.95) * 60 - def parse_gifts(self, gift_values: str) -> None: - pairs = gift_values.split('#') - for pair in pairs: - if not pair: - continue - slot, item, amount, sender, received = pair.split('+') - self.gifts[int(slot)] = (int(item), int(amount), sender, received) + def set_gifts_from_json(self, gift_json: str): + if gift_json: + gifts = json.loads(gift_json) + for slot, gift_data in gifts.items(): + self.gifts[int(slot)] = ( + int(gift_data['item']), + int(gift_data['amount']), + int(gift_data['sender']), + gift_data['received'] + ) + + def get_gifts_as_json(self) -> str: + gifts_json = {} + + for index, (slot, (item, amount, sender, received)) in enumerate(self.gifts.items(), start=0): + gifts_json[index] = { + 'item': item, + 'amount': amount, + 'sender': sender, + 'received': received + } + + return json.dumps(gifts_json) def build_gifts(self) -> str: pairs = [] From 2adc6f9bc6ebad187c864ab3ba1f388f0e4a84fa Mon Sep 17 00:00:00 2001 From: Bence <78733248+BXn4@users.noreply.github.com> Date: Tue, 24 Sep 2024 10:58:30 +0200 Subject: [PATCH 6/8] Set password empty in db --- database.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database.py b/database.py index 8ae669e..2863e55 100644 --- a/database.py +++ b/database.py @@ -10,7 +10,7 @@ def __init__(self): try: conn = mariadb.connect( user="root", - password="1234", + password="", host="localhost", port=3306, database="gg_cafe", From ce3970cb96372976123d549c61fdce7fd37c478b Mon Sep 17 00:00:00 2001 From: Bence <78733248+BXn4@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:53:02 +0200 Subject: [PATCH 7/8] Reorder gifts on delete / use --- commands/gmg.py | 3 ++- objects/player.py | 8 +++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/commands/gmg.py b/commands/gmg.py index e76e552..8ebf161 100644 --- a/commands/gmg.py +++ b/commands/gmg.py @@ -12,6 +12,7 @@ async def handle_gmg(server: 'CafeServer', client: 'StreamWriter', *params: str) response = ExtensionResponse('gmg', '-1', '0', player.build_gifts()) - # print(player.build_gifts()) + # print(player.build_gifts()) THIS NEEDS RE-ORDER + # print(player.get_gifts_as_json()) ALREADY RE-ORDERED await server.send_response(client, response) diff --git a/objects/player.py b/objects/player.py index 9a6b4c2..bf48d2a 100644 --- a/objects/player.py +++ b/objects/player.py @@ -134,12 +134,10 @@ def remove_gift(self, slot: int): for index, (item, details) in enumerate(self.gifts.items(), start=0): if index == slot: self.gifts.pop(item) - break - def get_level(self) -> int: - if self.xp < 90: - return floor(pow(floor(self.xp / 10), 1 / 2)) - return floor(pow(floor(self.xp / 5), 1 / 3.72)) + # RE-ORDER + self.gifts = {index: details for index, (item, details) in enumerate(self.gifts.items())} + break def to_response(self, *params: str) -> list[str]: return [ From f3a70bac30077be43dc8a5bc9b83b7aac4e92bfa Mon Sep 17 00:00:00 2001 From: Bence <78733248+BXn4@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:54:23 +0200 Subject: [PATCH 8/8] Added back the get_level function --- objects/player.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/objects/player.py b/objects/player.py index bf48d2a..01006bd 100644 --- a/objects/player.py +++ b/objects/player.py @@ -139,6 +139,11 @@ def remove_gift(self, slot: int): self.gifts = {index: details for index, (item, details) in enumerate(self.gifts.items())} break + def get_level(self) -> int: + if self.xp < 90: + return floor(pow(floor(self.xp / 10), 1 / 2)) + return floor(pow(floor(self.xp / 5), 1 / 3.72)) + def to_response(self, *params: str) -> list[str]: return [ *params, str(self.id), str(self.id), '0', str(self.cash), str(self.gold), str(self.xp),