From 0024588b6bee9859e90c80b376f4ad6f3595cc98 Mon Sep 17 00:00:00 2001 From: JeffTheRock <84420756+JeffTheRock@users.noreply.github.com> Date: Thu, 24 Jul 2025 02:08:59 -0400 Subject: [PATCH] misc fixes (#106) * misc fixes houdini.sql: fixed a bug that can cause penguins to be deleted if an item or puffle is deleted, missing pin dates, mascot item types, missing rooms, incorrect tourdude quest reward, and various minor mascot issues. houdini.data.penguin: reflect database changes houdini.handlers.play.epf: use correct error code for not enough medals houdini.handlers.play.igloo: use proper error codes for when player owns flooring/igloo/location, or max furniture quantity houdini.handlers.play.item: fixed an issue where the stampbook would display pin dates one day ahead houdini.handlers.play.pet: fixed digging not allowing multiple puffle items/furniture, cost of puffle creatures, adopting gold/rainbow puffles does not give their toys/food, and use correct error codes for puffle items * fix missed keys * fix ordering * fix walking key * fix issue with super exclusive bonus items * fix issue where comparison fails for puffle items --- houdini.sql | 187 ++++++++++++++-------------- houdini/data/penguin.py | 24 ++-- houdini/handlers/play/epf.py | 2 +- houdini/handlers/play/igloo.py | 11 +- houdini/handlers/play/item.py | 4 +- houdini/handlers/play/pet.py | 30 +++-- houdini/handlers/redemption/code.py | 2 +- 7 files changed, 143 insertions(+), 117 deletions(-) diff --git a/houdini.sql b/houdini.sql index 918ee02..3131c36 100644 --- a/houdini.sql +++ b/houdini.sql @@ -599,16 +599,16 @@ CREATE TABLE penguin ( rejection_de BOOLEAN NOT NULL DEFAULT FALSE, rejection_ru BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (id), - CONSTRAINT penguin_ibfk_1 FOREIGN KEY (color) REFERENCES item (id) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT penguin_ibfk_2 FOREIGN KEY (head) REFERENCES item (id) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT penguin_ibfk_3 FOREIGN KEY (face) REFERENCES item (id) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT penguin_ibfk_4 FOREIGN KEY (neck) REFERENCES item (id) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT penguin_ibfk_5 FOREIGN KEY (body) REFERENCES item (id) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT penguin_ibfk_6 FOREIGN KEY (hand) REFERENCES item (id) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT penguin_ibfk_7 FOREIGN KEY (feet) REFERENCES item (id) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT penguin_ibfk_8 FOREIGN KEY (photo) REFERENCES item (id) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT penguin_ibfk_9 FOREIGN KEY (flag) REFERENCES item (id) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT penguin_ibfk_10 FOREIGN KEY (character) REFERENCES character (id) ON DELETE CASCADE ON UPDATE CASCADE + CONSTRAINT penguin_ibfk_1 FOREIGN KEY (color) REFERENCES item (id) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT penguin_ibfk_2 FOREIGN KEY (head) REFERENCES item (id) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT penguin_ibfk_3 FOREIGN KEY (face) REFERENCES item (id) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT penguin_ibfk_4 FOREIGN KEY (neck) REFERENCES item (id) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT penguin_ibfk_5 FOREIGN KEY (body) REFERENCES item (id) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT penguin_ibfk_6 FOREIGN KEY (hand) REFERENCES item (id) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT penguin_ibfk_7 FOREIGN KEY (feet) REFERENCES item (id) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT penguin_ibfk_8 FOREIGN KEY (photo) REFERENCES item (id) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT penguin_ibfk_9 FOREIGN KEY (flag) REFERENCES item (id) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT penguin_ibfk_10 FOREIGN KEY (character) REFERENCES character (id) ON DELETE SET NULL ON UPDATE CASCADE ); CREATE INDEX penguin_email ON Penguin(email); @@ -972,7 +972,7 @@ CREATE TABLE penguin_igloo_room ( CONSTRAINT igloo_room_ibfk_4 FOREIGN KEY (location) REFERENCES location (id) ON DELETE CASCADE ON UPDATE CASCADE ); -ALTER TABLE penguin ADD CONSTRAINT penguin_ibfk_11 FOREIGN KEY (igloo) REFERENCES penguin_igloo_room (id) ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE penguin ADD CONSTRAINT penguin_ibfk_11 FOREIGN KEY (igloo) REFERENCES penguin_igloo_room (id) ON DELETE SET NULL ON UPDATE CASCADE; COMMENT ON TABLE penguin_igloo_room IS 'Penguin igloo settings'; @@ -1241,7 +1241,7 @@ COMMENT ON COLUMN penguin_puffle.hat IS 'Puffle hat item ID'; COMMENT ON COLUMN penguin_puffle.backyard IS 'Is in backyard?'; COMMENT ON COLUMN penguin_puffle.has_dug IS 'Has dug?'; -ALTER TABLE penguin ADD CONSTRAINT penguin_ibfk_12 FOREIGN KEY (walking) REFERENCES penguin_puffle (id) ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE penguin ADD CONSTRAINT penguin_ibfk_12 FOREIGN KEY (walking) REFERENCES penguin_puffle (id) ON DELETE SET NULL ON UPDATE CASCADE; DROP TABLE IF EXISTS penguin_puffle_item; CREATE TABLE penguin_puffle_item ( @@ -5097,7 +5097,7 @@ INSERT INTO item (id, name, type, cost, member, bait, patched, legacy_inventory, (7021, 'Shield', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2010-05-06'), (7022, 'Cream Soda Barrel', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2010-05-20'), (7023, 'Seashell', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2010-06-03'), - (7024, 'Ruby', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, now()), + (7024, 'Ruby', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2010-06-10'), (7025, 'Recycle', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2010-04-22'), (7026, 'Light Bulb', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2010-06-17'), (7027, 'Toothbrush', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-05-19'), @@ -5135,11 +5135,11 @@ INSERT INTO item (id, name, type, cost, member, bait, patched, legacy_inventory, (7059, 'Savanna Tree Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-04-20'), (7060, 'Medieval Shield', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-05-06'), (7061, 'Brazier Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-05-19'), - (7062, 'Mermaid Shell Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2013-06-05'), - (7063, 'Eye Patch Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-07-20'), - (7064, 'Telescope', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, now()), - (7066, 'Tropical Feather', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-07-20'), - (7067, 'Old Key', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-07-20'), + (7062, 'Mermaid Shell Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-05-20'), + (7063, 'Eye Patch Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-07-22'), + (7064, 'Telescope', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-07-22'), + (7066, 'Tropical Feather', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-07-22'), + (7067, 'Old Key', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-07-22'), (7068, 'Enchanted Feather Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2015-02-04'), (7069, 'Red Electric Guitar Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-06-02'), (7070, 'Stereo Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2011-06-16'), @@ -5316,7 +5316,7 @@ INSERT INTO item (id, name, type, cost, member, bait, patched, legacy_inventory, (7245, 'Royal Scepter Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2015-09-02'), (7246, 'Royal Crown Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2015-09-16'), (7247, 'Descendants Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2015-09-30'), - (7248, 'Anniversary Balloons', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, now()), + (7248, 'Anniversary Balloons', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2015-10-14'), (7249, 'Happy Halloween Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2015-10-28'), (7250, 'Mustache Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2015-11-10'), (7251, 'Area 501 Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2015-11-25'), @@ -5372,12 +5372,12 @@ INSERT INTO item (id, name, type, cost, member, bait, patched, legacy_inventory, (7301, 'Nutcracker Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2016-12-11'), (7302, 'Beard Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2016-12-18'), (7303, 'CFC 2016 Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2016-11-30'), - (7304, 'Holiday Ornament Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, now()), + (7304, 'Holiday Ornament Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2016-11-30'), (7305, 'Candle Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2016-12-15'), (7306, 'Wink Emoji Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2017-01-04'), (7307, 'Passport Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2017-01-04'), (7308, 'Community Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2017-01-31'), - (7309, 'Puffle Trivia Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, now()), + (7309, 'Puffle Trivia Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2017-01-31'), (7310, 'Spy Trivia Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2017-02-03'), (7311, 'Party Trivia Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2017-02-04'), (7312, 'Items Trivia Pin', 8, 0, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, '2017-02-06'), @@ -6812,32 +6812,32 @@ INSERT INTO item (id, name, type, cost, member, bait, patched, legacy_inventory, (90000, 'Elsa''s Braid', 2, 0, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, now()); INSERT INTO item (id, name, type, cost, member, bait) VALUES - (115, 'Gary''s Glasses', 2, 0, FALSE, TRUE), - (442, 'Rockhopper''s Hat', 1, 0, FALSE, TRUE), - (1000, 'Franky''s Cowboy Hat', 1, 0, FALSE, TRUE), - (1001, 'G Billy''s Cowboy Hat', 1, 0, FALSE, TRUE), - (1002, 'Stompin Bob''s Cowboy Hat', 1, 0, FALSE, TRUE), - (1003, 'Petey K''s Old Cowboy Hat', 1, 0, TRUE, TRUE), - (1068, 'Sensei''s Hat', 1, 0, FALSE, TRUE), - (1257, 'Rookies Hat', 1, 0, FALSE, TRUE), - (1458, 'Rocky''s Hair', 1, 0, FALSE, TRUE), - (1459, 'CeCe''s Hair', 1, 0, FALSE, TRUE), - (1460, 'Cadence''s 2012 Hair', 1, 0, FALSE, TRUE), - (1654, 'Darth Herbert''s Costume', 1, 0, TRUE, TRUE), - (2000, 'Petey K''s Old Sunglasses', 2, 0, FALSE, TRUE), - (3130, 'Rocky''s Necklace', 3, 0, FALSE, TRUE), - (3131, 'CeCe Necklace', 3, 0, FALSE, TRUE), - (4148, 'Sensei''s Fire Suit', 4, 0, FALSE, TRUE), - (4281, 'Sensei''s Water Suit', 4, 0, FALSE, TRUE), - (4690, 'Rocky Outfit', 4, 0, FALSE, TRUE), - (4691, 'Cece Outfit', 4, 0, FALSE, TRUE), - (4712, 'Rockhopper''s Belt', 4, 0, FALSE, TRUE), - (4752, 'Herberts Eyebrows', 2, 0, TRUE, TRUE), - (5168, 'Rocky''s Bracelet', 5, 0, FALSE, TRUE), - (5169, 'CeCe''s Bracelet', 5, 0, FALSE, TRUE), - (6078, 'Petey K''s Shoes', 6, 0, FALSE, TRUE), - (6127, 'Rocky''s Shoes', 6, 0, FALSE, TRUE), - (6128, 'CeCe''s Shoes', 6, 0, FALSE, TRUE); + (115, 'Gary''s Glasses', 3, 0, FALSE, TRUE), + (442, 'Rockhopper''s Hat', 2, 0, FALSE, TRUE), + (1000, 'Franky''s Cowboy Hat', 2, 0, FALSE, TRUE), + (1001, 'G Billy''s Cowboy Hat', 2, 0, FALSE, TRUE), + (1002, 'Stompin Bob''s Cowboy Hat', 2, 0, FALSE, TRUE), + (1003, 'Petey K''s Old Cowboy Hat', 2, 0, TRUE, TRUE), + (1068, 'Sensei''s Hat', 2, 0, FALSE, TRUE), + (1257, 'Rookies Hat', 2, 0, FALSE, TRUE), + (1458, 'Rocky''s Hair', 2, 0, FALSE, TRUE), + (1459, 'CeCe''s Hair', 2, 0, FALSE, TRUE), + (1460, 'Cadence''s 2012 Hair', 2, 0, FALSE, TRUE), + (1654, 'Darth Herbert''s Costume', 2, 0, TRUE, TRUE), + (2000, 'Petey K''s Old Sunglasses', 3, 0, FALSE, TRUE), + (3130, 'Rocky''s Necklace', 4, 0, FALSE, TRUE), + (3131, 'CeCe Necklace', 4, 0, FALSE, TRUE), + (4148, 'Sensei''s Fire Suit', 5, 0, FALSE, TRUE), + (4281, 'Sensei''s Water Suit', 5, 0, FALSE, TRUE), + (4690, 'Rocky Outfit', 5, 0, FALSE, TRUE), + (4691, 'Cece Outfit', 5, 0, FALSE, TRUE), + (4712, 'Rockhopper''s Belt', 5, 0, FALSE, TRUE), + (4752, 'Herberts Eyebrows', 3, 0, TRUE, TRUE), + (5168, 'Rocky''s Bracelet', 6, 0, FALSE, TRUE), + (5169, 'CeCe''s Bracelet', 6, 0, FALSE, TRUE), + (6078, 'Petey K''s Shoes', 7, 0, FALSE, TRUE), + (6127, 'Rocky''s Shoes', 7, 0, FALSE, TRUE), + (6128, 'CeCe''s Shoes', 7, 0, FALSE, TRUE); INSERT INTO card (id, name, set_id, power_id, element, color, value, description) VALUES (1, 'CART SURFER', 1, 0, 'f', 'b', 3, ''), @@ -9908,6 +9908,10 @@ INSERT INTO room (id, name, member, max_users, required_item, game, blackhole, s (867, 'Party17', TRUE, 80, NULL, FALSE, FALSE, FALSE, NULL), (868, 'Party18', TRUE, 80, NULL, FALSE, FALSE, FALSE, NULL), (869, 'Party19', FALSE, 80, NULL, FALSE, FALSE, FALSE, NULL), + (870, 'Party20', FALSE, 80, NULL, FALSE, FALSE, FALSE, NULL), + (871, 'Party21', FALSE, 80, NULL, FALSE, FALSE, FALSE, NULL), + (872, 'Party22', FALSE, 80, NULL, FALSE, FALSE, FALSE, NULL), + (873, 'Party23', FALSE, 80, NULL, FALSE, FALSE, FALSE, NULL), (874, 'Party24', FALSE, 80, NULL, FALSE, FALSE, FALSE, NULL), (875, 'Party25', FALSE, 80, NULL, FALSE, FALSE, FALSE, NULL), (876, 'Party26', FALSE, 80, NULL, FALSE, FALSE, FALSE, NULL), @@ -9977,7 +9981,7 @@ INSERT INTO quest (id, name) VALUES (3, 'igloo'); INSERT INTO quest_award_item (quest_id, item_id) VALUES (1, 24023); INSERT INTO quest_award_furniture (quest_id, furniture_id) VALUES (3, 2166); -INSERT INTO quest_award_puffle_item (quest_id, puffle_item_id) VALUES (2, 70); +INSERT INTO quest_award_puffle_item (quest_id, puffle_item_id) VALUES (2, 142); INSERT INTO quest_task (quest_id, description, room_id) VALUES (1, 'Visit the Clothes Shop', 130); INSERT INTO quest_task (quest_id, description, room_id) VALUES (2, 'Visit the Pet Shop', 310); @@ -11610,46 +11614,47 @@ INSERT INTO character (id, name, gift_id, stamp_id) VALUES (18, 'Director', NULL, NULL), (19, 'Klutzy', NULL, NULL), (25, 'G', 9190, NULL), - (26, 'Happy77', NULL, NULL), - (27, 'Billybob', NULL, NULL), + (26, 'Rocky', 9156, NULL), + (27, 'CeCe', 9156, NULL), (28, 'PH', 9193, 448), (31, 'Brady', 9211, NULL), (32, 'McKenzie', 9211, NULL), (33, 'Kermit The Frog', 9252, NULL), - (35, 'Sam', 9277, NULL); + (35, 'Sam', 9277, NULL), + (36, 'Merry Walrus', 9286, NULL); -INSERT INTO penguin (id, username, nickname, approval_en, password, email, color, character) VALUES - (1, 'rockhopper', 'Rockhopper', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 5, 1), - (2, 'aunt arctic', 'Aunt Arctic', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 2, 2), - (3, 'cadence', 'Cadence', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 10, 3), - (4, 'gary', 'Gary', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 4), - (5, 'franky', 'Franky', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 7, 5), - (6, 'petey k', 'Petey K', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 2, 6), - (7, 'g billy', 'G Billy', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 7), - (8, 'stompin bob', 'Stompin Bob', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 5, 8), - (9, 'sensei', 'Sensei', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 14, 9), - (10, 'herbert', 'Herbert P Bear', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 10), - (11, 'wheel bot', 'Wheel Bot', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 11), - (12, 'jet bot', 'Jet Bot', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 12), - (13, 'snow bot', 'Snow Bot', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 13), - (14, 'protobot', 'Protobot', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 14), - (15, 'dot', 'Dot', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 15), - (16, 'rookie', 'Rookie', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 11, 16), - (17, 'jet pack guy', 'Jet Pack Guy', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 17), - (18, 'director', 'Director', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 18), - (19, 'klutzy', 'Klutzy', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 19), - (20, 'g', 'G', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 25), - (21, 'ph', 'PH', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 9, 28), - (22, 'brady', 'Brady', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 7, 31), - (23, 'mckenzie', 'McKenzie', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 15, 32), - (24, 'kermit', 'Kermit The Frog', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 2, 33), - (25, 'sam', 'Sam', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 35), - (26, 'rocky', 'Rocky', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 15, NULL), - (27, 'cece', 'CeCe', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 7, NULL), - (28, 'merry walrus', 'Merry Walrus', TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, NULL); +INSERT INTO penguin (id, username, nickname, approval_en, approval_pt, approval_fr, approval_es, approval_de, approval_ru, active, password, email, color, character) VALUES + (1, 'rockhopper', 'Rockhopper', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 5, 1), + (2, 'aunt arctic', 'Aunt Arctic', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 2, 2), + (3, 'cadence', 'Cadence', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 10, 3), + (4, 'gary', 'Gary', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 4), + (5, 'franky', 'Franky', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 7, 5), + (6, 'petey k', 'Petey K', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 2, 6), + (7, 'g billy', 'G Billy', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 7), + (8, 'stompin bob', 'Stompin Bob', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 5, 8), + (9, 'sensei', 'Sensei', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 14, 9), + (10, 'herbert', 'Herbert P Bear', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 16, 10), + (11, 'wheel bot', 'Wheel Bot', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 11), + (12, 'jet bot', 'Jet Bot', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 12), + (13, 'snow bot', 'Snow Bot', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 13), + (14, 'protobot', 'Protobot', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 14), + (15, 'dot1', 'Dot', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 17, 15), + (16, 'rookie', 'Rookie', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 2, 16), + (17, 'jet pack guy', 'Jet Pack Guy', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 2), + (18, 'director', 'Director', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 18), + (19, 'klutzy', 'Klutzy', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 19), + (25, 'g111', 'G', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 1, 25), + (26, 'rocky', 'Rocky', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 15, 26), + (27, 'cece', 'CeCe', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 7, 27), + (28, 'paige', 'PH', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 9, 28), + (31, 'brady', 'Brady', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 7, 31), + (32, 'mckenzie', 'McKenzie', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 15, 32), + (33, 'kermit', 'Kermit The Frog', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 2, 33), + (35, 'sasquatch', 'Sam', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 9, 35), + (36, 'merry walrus', 'Merry Walrus', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', '', 12, 36); -INSERT INTO penguin (username, nickname, approval_en, active, password, email, color) VALUES - ('basil', 'Basil', TRUE, TRUE, '$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', 'basil@solero.me', 1); +INSERT INTO penguin (username, nickname, approval_en, approval_pt, approval_fr, approval_es, approval_de, approval_ru, active, password, email, color) VALUES + ('basil', 'Basil', TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE,'$2b$12$CCYijGFRZyymIJWWNpkmP.pysAEN5E1mRwPtrjIDmTR3LnhKdJeBK', 'basil@solero.me', 1); INSERT INTO penguin_item (penguin_id, item_id) VALUES (101, 1); @@ -11664,14 +11669,14 @@ INSERT INTO penguin_item (penguin_id, item_id) VALUES (7, 1), (7, 6080), (7, 5107), (7, 1275), (7, 4384), (7, 1001), (7, 1919), (7, 5000), (8, 5), (8, 5025), (8, 4383), (8, 5106), (8, 5105), (8, 1274), (8, 1920), (8, 1002), (9, 14), (9, 1622), (9, 4885), (9, 6177), (9, 4148), (9, 1068), (9, 4281), (9, 2009), - (10, 1), (10, 1654), (10, 1737), (10, 4752), - (15, 1), (15, 17), (15, 24315), (15, 21032), - (16, 11), (16, 4969), (16, 1783), (16, 1720), (16, 4366), (16, 1257), (16, 4365), (16, 2030), - (21, 9), (21, 1384), (21, 4555), (21, 1974), (21, 1947), (21, 1736), - (22, 7), (22, 1682), - (23, 15), (23, 1683), - (24, 2), (24, 1805), - (25, 1), (25, 1917), + (10, 16), (10, 1654), (10, 1737), (10, 4752), + (15, 17), (15, 24315), (15, 21032), + (16, 2), (16, 4969), (16, 1783), (16, 1720), (16, 4366), (16, 1257), (16, 4365), (16, 2030), (26, 15), (26, 5168), (26, 1458), (26, 3130), (26, 4690), (26, 6127), (27, 7), (27, 5169), (27, 1459), (27, 3131), (27, 4691), (27, 6128), - (28, 1), (28, 1964); + (28, 9), (28, 1384), (28, 4555), (28, 1974), (28, 1947), (28, 1736), + (31, 7), (31, 1682), + (32, 15), (32, 1683), + (33, 2), (33, 1805), + (35, 9), (35, 1917), + (36, 12), (36, 1964); diff --git a/houdini/data/penguin.py b/houdini/data/penguin.py index 7b2597c..1326b20 100644 --- a/houdini/data/penguin.py +++ b/houdini/data/penguin.py @@ -19,18 +19,18 @@ class Penguin(db.Model): minutes_played = db.Column(db.Integer, nullable=False, server_default=db.text("0")) moderator = db.Column(db.Boolean, nullable=False, server_default=db.text("false")) stealth_moderator = db.Column(db.Boolean, nullable=False, server_default=db.text("false")) - character = db.Column(db.ForeignKey('character.id', ondelete='CASCADE', onupdate='CASCADE')) - igloo = db.Column(db.ForeignKey('penguin_igloo_room.id', ondelete='CASCADE', onupdate='CASCADE')) + character = db.Column(db.ForeignKey('character.id', ondelete='SET NULL', onupdate='SET NULL')) + igloo = db.Column(db.ForeignKey('penguin_igloo_room.id', ondelete='SET NULL', onupdate='SET NULL')) coins = db.Column(db.Integer, nullable=False, server_default=db.text("500")) - color = db.Column(db.ForeignKey('item.id', ondelete='CASCADE', onupdate='CASCADE')) - head = db.Column(db.ForeignKey('item.id', ondelete='CASCADE', onupdate='CASCADE')) - face = db.Column(db.ForeignKey('item.id', ondelete='CASCADE', onupdate='CASCADE')) - neck = db.Column(db.ForeignKey('item.id', ondelete='CASCADE', onupdate='CASCADE')) - body = db.Column(db.ForeignKey('item.id', ondelete='CASCADE', onupdate='CASCADE')) - hand = db.Column(db.ForeignKey('item.id', ondelete='CASCADE', onupdate='CASCADE')) - feet = db.Column(db.ForeignKey('item.id', ondelete='CASCADE', onupdate='CASCADE')) - photo = db.Column(db.ForeignKey('item.id', ondelete='CASCADE', onupdate='CASCADE')) - flag = db.Column(db.ForeignKey('item.id', ondelete='CASCADE', onupdate='CASCADE')) + color = db.Column(db.ForeignKey('item.id', ondelete='SET NULL', onupdate='CASCADE')) + head = db.Column(db.ForeignKey('item.id', ondelete='SET NULL', onupdate='CASCADE')) + face = db.Column(db.ForeignKey('item.id', ondelete='SET NULL', onupdate='CASCADE')) + neck = db.Column(db.ForeignKey('item.id', ondelete='SET NULL', onupdate='CASCADE')) + body = db.Column(db.ForeignKey('item.id', ondelete='SET NULL', onupdate='CASCADE')) + hand = db.Column(db.ForeignKey('item.id', ondelete='SET NULL', onupdate='CASCADE')) + feet = db.Column(db.ForeignKey('item.id', ondelete='SET NULL', onupdate='CASCADE')) + photo = db.Column(db.ForeignKey('item.id', ondelete='SET NULL', onupdate='CASCADE')) + flag = db.Column(db.ForeignKey('item.id', ondelete='SET NULL', onupdate='CASCADE')) permaban = db.Column(db.Boolean, nullable=False, server_default=db.text("false")) book_modified = db.Column(db.SmallInteger, nullable=False, server_default=db.text("0")) book_color = db.Column(db.SmallInteger, nullable=False, server_default=db.text("1")) @@ -58,7 +58,7 @@ class Penguin(db.Model): has_dug = db.Column(db.Boolean, nullable=False, server_default=db.text("false")) puffle_handler = db.Column(db.Boolean, nullable=False, server_default=db.text("false")) nuggets = db.Column(db.SmallInteger, nullable=False, server_default=db.text("0")) - walking = db.Column(db.ForeignKey('penguin_puffle.id', ondelete='CASCADE', onupdate='CASCADE')) + walking = db.Column(db.ForeignKey('penguin_puffle.id', ondelete='SET NULL', onupdate='CASCADE')) opened_playercard = db.Column(db.Boolean, nullable=False, server_default=db.text("false")) special_wave = db.Column(db.Boolean, nullable=False, server_default=db.text("false")) special_dance = db.Column(db.Boolean, nullable=False, server_default=db.text("false")) diff --git a/houdini/handlers/play/epf.py b/houdini/handlers/play/epf.py index c74b8fb..8891661 100644 --- a/houdini/handlers/play/epf.py +++ b/houdini/handlers/play/epf.py @@ -110,7 +110,7 @@ async def handle_buy_epf_item(p, item: Item): return await p.send_error(400) if p.agent_medals < item.cost: - return await p.send_error(401) + return await p.send_error(405) await p.add_epf_inventory(item) diff --git a/houdini/handlers/play/igloo.py b/houdini/handlers/play/igloo.py index c162af5..9b80af2 100644 --- a/houdini/handlers/play/igloo.py +++ b/houdini/handlers/play/igloo.py @@ -206,7 +206,7 @@ async def handle_buy_flooring(p, flooring: Flooring): if p.is_vanilla_client: if flooring.id in p.flooring: - return await p.send_error(400) + return await p.send_error(501) if p.coins < flooring.cost: return await p.send_error(401) @@ -231,7 +231,7 @@ async def handle_buy_igloo_location(p, location: Location): return await p.send_error(402) if location.id in p.locations: - return await p.send_error(400) + return await p.send_error(502) if p.coins < location.cost: return await p.send_error(401) @@ -245,7 +245,7 @@ async def handle_buy_igloo_type(p, igloo: Igloo): return await p.send_error(402) if igloo.id in p.igloos: - return await p.send_error(400) + return await p.send_error(500) if p.coins < igloo.cost: return await p.send_error(401) @@ -260,6 +260,11 @@ async def handle_buy_furniture(p, furniture: Furniture): if p.coins < furniture.cost: return await p.send_error(401) + + if furniture.id in p.furniture: + penguin_furniture = p.furniture[furniture.id] + if penguin_furniture.quantity >= furniture.max_quantity: + return await p.send_error(403) await p.add_furniture(furniture) diff --git a/houdini/handlers/play/item.py b/houdini/handlers/play/item.py index c883c05..1ee81eb 100644 --- a/houdini/handlers/play/item.py +++ b/houdini/handlers/play/item.py @@ -1,5 +1,5 @@ import operator -import time +import calendar from houdini import handlers from houdini.data.item import Item, ItemCollection, PenguinItemCollection @@ -20,7 +20,7 @@ async def get_pin_string(p, player_id): pins = sorted(free_pins, key=operator.attrgetter('release_date')) def get_string(pin): - unix = int(time.mktime(pin.release_date.timetuple())) + unix = int(calendar.timegm(pin.release_date.timetuple())) - 86400 return f'{pin.id}|{unix}|{int(pin.member)}' return '%'.join(get_string(pin) for pin in pins) diff --git a/houdini/handlers/play/pet.py b/houdini/handlers/play/pet.py index 8c376af..3354908 100644 --- a/houdini/handlers/play/pet.py +++ b/houdini/handlers/play/pet.py @@ -65,7 +65,7 @@ async def dig(p, on_command=False): treasure_quantity, item_id = 1, 0 if p.can_dig_gold: - treasure_types = {0: 'coins', 4: 'golden', None: None} + treasure_types = {0: 'coins', 1: 'food', 2: 'furniture', 3: 'clothing', 4: 'golden', None: None} puffle_age = (datetime.now() - walking_puffle.adoption_date).days puffle_health = walking_puffle.food + walking_puffle.play + walking_puffle.rest + walking_puffle.clean @@ -85,7 +85,8 @@ async def dig(p, on_command=False): elif treasure_type == 'food': diggable_food_ids = [t.puffle_item_id for t in p.server.puffle_food_treasure if t.puffle_id == walking_puffle.puffle_id - and t.puffle_item_id not in p.puffle_items] + and (t.puffle_item_id not in p.puffle_items or p.puffle_items[t.puffle_item_id].quantity < 100)] + if diggable_food_ids: item_id = random.choice(diggable_food_ids) await p.add_puffle_item(p.server.puffle_items[item_id], notify=False, cost=0) @@ -94,7 +95,8 @@ async def dig(p, on_command=False): elif treasure_type == 'furniture': diggable_furniture_ids = [t.furniture_id for t in p.server.puffle_furniture_treasure if t.puffle_id == walking_puffle.puffle_id - and t.furniture_id not in p.furniture] + and (t.furniture_id not in p.furniture or p.furniture[t.furniture_id].quantity < p.server.furniture[t.furniture_id].max_quantity)] + if diggable_furniture_ids: item_id = random.choice(diggable_furniture_ids) await p.add_furniture(p.server.furniture[item_id], notify=False, cost=0) @@ -302,8 +304,10 @@ async def handle_adopt_puffle_vanilla(p, type_id: int, name: str, subtype_id: in if type_id not in p.server.puffles or not check_name(p, name): return await p.send_error(441) + puffle_id = subtype_id if bool(subtype_id) else type_id + name = name.title() - cost = p.server.puffles[type_id].cost + cost = p.server.puffles[puffle_id].cost if p.coins < cost: return await p.send_error(401) @@ -311,8 +315,6 @@ async def handle_adopt_puffle_vanilla(p, type_id: int, name: str, subtype_id: in if len(p.puffles) >= 75: return await p.send_error(440) - puffle_id = subtype_id if bool(subtype_id) else type_id - if type_id == 10: if not p.rainbow_adoptability: return await p.send_error(441) @@ -320,7 +322,8 @@ async def handle_adopt_puffle_vanilla(p, type_id: int, name: str, subtype_id: in elif type_id == 11: await p.update(nuggets=p.nuggets - 15).apply() p.can_dig_gold = False - elif subtype_id == 0: + + if subtype_id == 0: await p.add_puffle_item(p.server.puffle_items[3], quantity=5, cost=0) await p.add_puffle_item(p.server.puffle_items[79], cost=0) await p.add_puffle_item(p.server.puffle_items[p.server.puffles[puffle_id].favourite_toy]) @@ -618,9 +621,22 @@ async def handle_add_puffle_care_item(p, item_id: int): return await p.send_error(402) care_item = p.server.puffle_items[item_id] + care_item_id = care_item.parent_id if care_item.cost > p.coins: return await p.send_error(401) + + if care_item_id in p.puffle_items: + penguin_care_item = p.puffle_items[care_item_id] + + if care_item.play_external == "superplay": + return await p.send_error(408) + + if penguin_care_item.quantity >= 100: + if penguin_care_item.type == "head": + return await p.send_error(407) + else: + return await p.send_error(406) await p.add_puffle_item(care_item) diff --git a/houdini/handlers/redemption/code.py b/houdini/handlers/redemption/code.py index 36a5bce..e8abd1c 100644 --- a/houdini/handlers/redemption/code.py +++ b/houdini/handlers/redemption/code.py @@ -288,7 +288,7 @@ async def handle_code_vanilla(p, redemption_code: str): await p.add_puffle_item(p.server.puffle_items[award.puffle_item_id], notify=False, cost=0) awards.append(f'pi{award.puffle_item_id},{int(item_allowed)}') - p.allowed_redemption_items = TreasureUnlockCount + bad_items + p.allowed_redemption_items = TreasureUnlockCount + bad_items + (2 if num_redeemed_codes == 4 else 0) p.server.cache.set(f'{p.id}.{code.code}.treasure_code', code) return await p.send_xt('rsc', 'treasurebook', p.allowed_redemption_items, owned_ids, num_redeemed_codes, 0, int(len(awards) > 0), '|'.join(awards))