From 50c7c2c55082be67176ca31cd32c63f1855899c3 Mon Sep 17 00:00:00 2001 From: Marces Zastrow Date: Fri, 17 Jan 2025 14:41:56 +0100 Subject: [PATCH] Peter --- backend/database.db | Bin 23224320 -> 23224320 bytes backend/server.js | 52 +++++++++- frontend/src/pages/gameMasterPage.jsx | 132 ++++++++++++++++++-------- 3 files changed, 143 insertions(+), 41 deletions(-) diff --git a/backend/database.db b/backend/database.db index 98c365321c5c3b7685a42bc25945bd55c46ab3d9..47b36cc714e2a5a6aa6955cda89b783cc66a1c0b 100644 GIT binary patch delta 8314 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 delta 10382 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 { stmt.finalize(); }); +// Update Player Character +app.put('/games/character/:charId', async (req, res) => { + const charId = req.params.charId; + const { + charName, race, sex, age, job, description, + maxHealth, currentHealth, maxMana, currentMana, + strength, dexterity, agility, endurance, + level, gold + } = req.body; + + const stmt = db.prepare(` + UPDATE PlayerCharacter + SET CharName = ?, Race = ?, Sex = ?, Age = ?, Job = ?, + Description = ?, MaxHealth = ?, CurrentHealth = ?, + MaxMana = ?, CurrentMana = ?, Strength = ?, + Dexterity = ?, Agility = ?, Endurance = ?, + Level = ?, Gold = ? + WHERE CharID = ? + `); + + stmt.run([ + charName, race, sex, age, job, description, + maxHealth, currentHealth, maxMana, currentMana, + strength, dexterity, agility, endurance, + level, gold, charId + ], function(err) { + if (err) { + console.error('Database error:', err); + return res.status(500).json({ error: 'Internal server error' }); + } + if (this.changes === 0) { + return res.status(404).json({ error: 'Character not found' }); + } + res.json({ message: 'Character updated successfully!' }); + }); + stmt.finalize(); +}); + // Fetch Player Items app.get('/games/:gameId/:charId/items', (req, res) => { const gameId = req.params.gameId; @@ -424,13 +462,18 @@ app.post('/games/:charId/:itemId/owner', (req, res) => { }) // Update Item details including owner -app.put('/games/item/:itemId', async (req, res) => { +app.put('/games/item/:itemId', (req, res) => { const itemId = req.params.itemId; const { ItemName, Type, Art, Rarity, MaxDurability, CurrentDurability, GoldValue, Abilities, OwnerID, AP } = req.body; - + + // Validate required fields + if (!ItemName) { + return res.status(400).json({ error: 'Item name is required' }); + } + const stmt = db.prepare(` UPDATE Item SET ItemName = ?, Type = ?, Art = ?, Rarity = ?, @@ -440,8 +483,9 @@ app.put('/games/item/:itemId', async (req, res) => { `); stmt.run([ - ItemName, Type, Art, Rarity, MaxDurability, CurrentDurability, - GoldValue, Abilities, OwnerID, AP, itemId + ItemName, Type, Art, Rarity, + MaxDurability, CurrentDurability, GoldValue, + Abilities, OwnerID, AP, itemId ], function(err) { if (err) { console.error('Database error:', err); diff --git a/frontend/src/pages/gameMasterPage.jsx b/frontend/src/pages/gameMasterPage.jsx index afad57e..803c7a6 100644 --- a/frontend/src/pages/gameMasterPage.jsx +++ b/frontend/src/pages/gameMasterPage.jsx @@ -105,44 +105,102 @@ const GameMasterPage = () => { setIsEditing(true); }; - // Update handleUpdate to fetch once after saving - const handleUpdate = async () => { - try { - let response; - if (editType === 'item') { - response = await axios.put(`http://localhost:5000/games/item/${selectedItem.ItemID}`, formData); - } else if (editType === 'npc') { - response = await axios.put(`http://localhost:5000/games/npc/${selectedItem.NPCID}`, formData); - } else if (editType === 'character') { - response = await axios.put(`http://localhost:5000/games/character/${selectedItem.CharID}`, formData); - } - - if (response.status === 200) { - const fetchData = async () => { - try { - const pcsResponse = await axios.get(`http://localhost:5000/games/${gameId}/playerchars`); - const processedPCs = Array.isArray(pcsResponse.data) ? pcsResponse.data : [pcsResponse.data]; - setPlayerCharacters(processedPCs.filter(pc => pc !== null)); - - const npcsResponse = await axios.get(`http://localhost:5000/games/${gameId}/npcs`); - const processedNPCs = Array.isArray(npcsResponse.data) ? npcsResponse.data : [npcsResponse.data]; - setNpcs(processedNPCs.filter(npc => npc !== null)); - - const itemsResponse = await axios.get(`http://localhost:5000/games/${gameId}/items`); - const processedItems = Array.isArray(itemsResponse.data) ? itemsResponse.data : [itemsResponse.data]; - setItems(processedItems.filter(item => item !== null)); - } catch (error) { - console.error('Error fetching data:', error); - } - }; - await fetchData(); // Fetch once after successful update - setEditModalOpen(false); - setFormData(null); - } - } catch (error) { - console.error('Error updating:', error); + // Update the handleUpdate function +const handleUpdate = async () => { + try { + let response; + if (editType === 'item') { + const itemData = { + ItemName: formData.ItemName, + Type: formData.Type, + Art: formData.Art, + Rarity: formData.Rarity, + MaxDurability: formData.MaxDurability, + CurrentDurability: formData.CurrentDurability, + GoldValue: formData.GoldValue, + Abilities: formData.Abilities, + OwnerID: formData.OwnerID, + AP: formData.AP + }; + response = await axios.put(`http://localhost:5000/games/item/${selectedItem.ItemID}`, itemData); + } else if (editType === 'npc') { + // Update NPC data + const npcData = { + Name: formData.Name, + Race: formData.Race, + Sex: formData.Sex, + Age: formData.Age, + Job: formData.Job, + Description: formData.Description, + MaxHealth: formData.MaxHealth, + CurrentHealth: formData.CurrentHealth, + MaxMana: formData.MaxMana, + CurrentMana: formData.CurrentMana, + Strength: formData.Strength, + Dexterity: formData.Dexterity, + Agility: formData.Agility, + Endurance: formData.Endurance, + Level: formData.Level, + Allied: formData.Allied + }; + response = await axios.put(`http://localhost:5000/games/npc/${selectedItem.NpcID}`, npcData); + } else if (editType === 'character') { + // Update Player Character data + const charData = { + charName: formData.CharName, + race: formData.Race, + sex: formData.Sex, + age: formData.Age, + job: formData.Job, + description: formData.Description, + maxHealth: formData.MaxHealth, + currentHealth: formData.CurrentHealth, + maxMana: formData.MaxMana, + currentMana: formData.CurrentMana, + strength: formData.Strength, + dexterity: formData.Dexterity, + agility: formData.Agility, + endurance: formData.Endurance, + level: formData.Level, + gold: formData.Gold + }; + response = await axios.put(`http://localhost:5000/games/character/${selectedItem.CharID}`, charData); } - }; + + if (response.status === 200) { + // Fetch updated data after successful update + const fetchData = async () => { + try { + // Fetch player characters + const pcsResponse = await axios.get(`http://localhost:5000/games/${gameId}/playerchars`); + setPlayerCharacters( + Array.isArray(pcsResponse.data) ? pcsResponse.data : [pcsResponse.data] + ); + + // Fetch NPCs + const npcsResponse = await axios.get(`http://localhost:5000/games/${gameId}/npcs`); + setNpcs( + Array.isArray(npcsResponse.data) ? npcsResponse.data : [npcsResponse.data] + ); + + // Fetch items + const itemsResponse = await axios.get(`http://localhost:5000/games/${gameId}/items`); + setItems( + Array.isArray(itemsResponse.data) ? itemsResponse.data : [itemsResponse.data] + ); + } catch (error) { + console.error('Error fetching updated data:', error); + } + }; + + await fetchData(); + setEditModalOpen(false); + setFormData(null); + } + } catch (error) { + console.error('Error updating:', error); + } +}; const handleModalClose = () => { setEditModalOpen(false);