diff --git a/README.md b/README.md index 2da701f..57e1598 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ +
+

Feels like a distant memory

-# WhimsyWorld + ![Gitea Last Commit](https://img.shields.io/gitea/last-commit/alterwain/WhimsyWorld?gitea_url=https%3A%2F%2Fgitea.awain.net) ![Jenkins Build](https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fjenkins.awain.net%2Fjob%2FWhimsyWorld&link=https%3A%2F%2Fjenkins.awain.net%2Fjob%2FWhimsyWorld) ![Contact](https://img.shields.io/badge/xmpp-alterwain-red?link=xmpp%3Aalterwain%40awain.net%3Fomemo-sid-687809972%3Dfc938d0c120affd1f011a1f1e53449b8b773ac7c322667f1dca2b2539987b86c) diff --git a/src/main/java/com/alterdekim/game/component/GameServer.java b/src/main/java/com/alterdekim/game/component/GameServer.java index ffe413c..49a0597 100644 --- a/src/main/java/com/alterdekim/game/component/GameServer.java +++ b/src/main/java/com/alterdekim/game/component/GameServer.java @@ -3,6 +3,9 @@ package com.alterdekim.game.component; import com.alterdekim.game.component.game.*; import com.alterdekim.game.component.game.friends.OneFR; import com.alterdekim.game.component.game.friends.UserFriend; +import com.alterdekim.game.component.game.home.HomeInventoryGroup; +import com.alterdekim.game.component.game.home.HomeLocation; +import com.alterdekim.game.component.game.home.HomeStuff; import com.alterdekim.game.component.game.inventory.BuyGoodResult; import com.alterdekim.game.component.game.inventory.BuyGoodResultGood; import com.alterdekim.game.component.game.minigame.MiniGameAction; @@ -63,6 +66,9 @@ public class GameServer { @Autowired private MiniGameService miniGameService; + @Autowired + private HomeInventoryService homeInventoryService; + private final Map players; private final ObjectMapper xmlMapper; @@ -159,6 +165,7 @@ public class GameServer { long requestedLocation = message.getArguments().get(1).getLong(); if( requestedLocation == -1L ) { int homePlayerId = message.getArguments().get(0).getInt(); + log.info("HOME: {}", xmlMapper.writeValueAsString(locationService.getHomeByUserId(homePlayerId)).replace("<", "<")); this.sendResult(playerId, message.getTransactionId(), xmlMapper.writeValueAsString(locationService.getHomeByUserId(homePlayerId)).replace("<", "<")); return; } @@ -297,6 +304,30 @@ public class GameServer { //this.call(playerId, CommandType.MiniGameAction, new MiniGameAction("OnReady", 0, "2")); //this.call(playerId, CommandType.MiniGameAction, new MiniGameAction("OnReady", 0, "3")); } + case GetUserHomeLocationData -> { + String xs = xmlMapper.writeValueAsString( + new HomeStuff( + this.homeInventoryService.getHomeInventoryOfUser(playerId), + List.of(new HomeLocation(102, 2, 102L, 54, 708, 0, true, false, true, true, false, ClubAccessType.OPEN, 0, 0, 0.0, 0.0, 0, 0, true, true, true, true)) + ) + ); + log.info("Output: {}", xs); + this.sendResult(playerId, message.getTransactionId(), xs); + } + case SaveLocationChanges -> { + if( message.getArguments().size() != 3 ) return; + int type = message.getArguments().get(1).getInt(); + if( type == -2 ) { // home + Map info = (Map) message.getArguments().get(2).getRaw(); + Map additions = (Map) info.get("Add").getRaw(); + this.homeInventoryService.addFurnitureToCurrentHome(playerId, additions); + + Map changes = (Map) info.get("Changes").getRaw(); + this.homeInventoryService.addFurnitureToCurrentHome(playerId, changes); + return; + } + // club + } } } diff --git a/src/main/java/com/alterdekim/game/component/game/UserCommandType.java b/src/main/java/com/alterdekim/game/component/game/UserCommandType.java index 7eb4cb6..acf7530 100644 --- a/src/main/java/com/alterdekim/game/component/game/UserCommandType.java +++ b/src/main/java/com/alterdekim/game/component/game/UserCommandType.java @@ -44,6 +44,8 @@ public enum UserCommandType { SendGameClose("_GC"), GameStatistics("_GT"), RegisterGameWaiting("_GR"), + GetUserHomeLocationData("_LDH"), + SaveLocationChanges("_LC"), Unknown(""); private final String value; diff --git a/src/main/java/com/alterdekim/game/component/game/home/HomeInventoryGroup.java b/src/main/java/com/alterdekim/game/component/game/home/HomeInventoryGroup.java new file mode 100644 index 0000000..9301ec8 --- /dev/null +++ b/src/main/java/com/alterdekim/game/component/game/home/HomeInventoryGroup.java @@ -0,0 +1,39 @@ +package com.alterdekim.game.component.game.home; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@AllArgsConstructor +public class HomeInventoryGroup { + + @JacksonXmlProperty(isAttribute = true, localName = "ID") + @Getter + private String id; + + @JacksonXmlProperty(isAttribute = true, localName = "AObjectTypeId") + private Integer objectTypeId; + + @JacksonXmlProperty(isAttribute = true, localName = "AObjectId") + @Getter + @Setter + private Long objectId; + + @JacksonXmlProperty(isAttribute = true, localName = "AObjectRefTypeId") + private Integer objectRefTypeId; + + @JacksonXmlProperty(isAttribute = true, localName = "MediaResourceID") + private Integer mediaResourceID; + + @JacksonXmlProperty(isAttribute = true, localName = "TextResourceID") + private Integer textResourceID; + + @JacksonXmlProperty(isAttribute = false, localName = "object") + @JacksonXmlElementWrapper(useWrapping = false, localName = "object") + @Getter + private List object; +} diff --git a/src/main/java/com/alterdekim/game/component/game/home/HomeInventoryObject.java b/src/main/java/com/alterdekim/game/component/game/home/HomeInventoryObject.java new file mode 100644 index 0000000..99dd12c --- /dev/null +++ b/src/main/java/com/alterdekim/game/component/game/home/HomeInventoryObject.java @@ -0,0 +1,16 @@ +package com.alterdekim.game.component.game.home; + +import com.alterdekim.game.xml.NumericBooleanSerializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class HomeInventoryObject { + @JacksonXmlProperty(isAttribute = true, localName = "ID") + private Integer id; + + @JacksonXmlProperty(isAttribute = true, localName = "IsActive") + @JsonSerialize(using = NumericBooleanSerializer.class) + private Boolean isActive; +} diff --git a/src/main/java/com/alterdekim/game/component/game/home/HomeLocation.java b/src/main/java/com/alterdekim/game/component/game/home/HomeLocation.java new file mode 100644 index 0000000..a9a19e3 --- /dev/null +++ b/src/main/java/com/alterdekim/game/component/game/home/HomeLocation.java @@ -0,0 +1,88 @@ +package com.alterdekim.game.component.game.home; + +import com.alterdekim.game.component.game.ClubAccessType; +import com.alterdekim.game.xml.ClubAccessTypeSerializer; +import com.alterdekim.game.xml.NumericBooleanSerializer; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class HomeLocation { + + @JacksonXmlProperty(isAttribute = true, localName = "ID") + private Integer id; + + @JacksonXmlProperty(isAttribute = true, localName = "AObjectTypeId") + private Integer objectTypeId; + + @JacksonXmlProperty(isAttribute = true, localName = "AObjectId") + private Long objectId; + + @JacksonXmlProperty(isAttribute = true, localName = "AObjectRefTypeId") + private Integer objectRefTypeId; + + @JacksonXmlProperty(isAttribute = true, localName = "MediaResourceID") + private Integer mediaResourceID; + + @JacksonXmlProperty(isAttribute = true, localName = "TextResourceID") + private Integer textResourceID; + + @JacksonXmlProperty(isAttribute = true, localName = "IsHome") + @JsonSerialize(using = NumericBooleanSerializer.class) + private Boolean isHome; + + @JacksonXmlProperty(isAttribute = true, localName = "IsClub") + @JsonSerialize(using = NumericBooleanSerializer.class) + private Boolean isClub; + + @JacksonXmlProperty(isAttribute = true, localName = "IsVisaAccessPermitted") + @JsonSerialize(using = NumericBooleanSerializer.class) + private Boolean IsVisaAccessPermitted; + + @JacksonXmlProperty(isAttribute = true, localName = "IsCurrent") + @JsonSerialize(using = NumericBooleanSerializer.class) + private Boolean isCurrent; + + @JacksonXmlProperty(isAttribute = true, localName = "IsLocked") + @JsonSerialize(using = NumericBooleanSerializer.class) + private Boolean isLocked; + + @JacksonXmlProperty(isAttribute = true, localName = "ClubAccessType") + @JsonSerialize(using = ClubAccessTypeSerializer.class) + private ClubAccessType clubAccessType; + + @JacksonXmlProperty(isAttribute = true, localName = "ClubCost") + private Integer clubCost; + + @JacksonXmlProperty(isAttribute = true, localName = "ClubRate") + private Integer clubRate; + + @JacksonXmlProperty(isAttribute = true) + private Double x; + + @JacksonXmlProperty(isAttribute = true) + private Double y; + + @JacksonXmlProperty(isAttribute = true, localName = "Frame") + private Integer frame; + + @JacksonXmlProperty(isAttribute = true, localName = "TweenerId") + private Integer tweenerId; + + @JacksonXmlProperty(isAttribute = true, localName = "IsVisible") + @JsonSerialize(using = NumericBooleanSerializer.class) + private Boolean isVisible; + + @JacksonXmlProperty(isAttribute = true, localName = "IsEnabled") + @JsonSerialize(using = NumericBooleanSerializer.class) + private Boolean isEnabled; + + @JacksonXmlProperty(isAttribute = true, localName = "IsPositionHeld") + @JsonSerialize(using = NumericBooleanSerializer.class) + private Boolean isPositionHeld; + + @JacksonXmlProperty(isAttribute = true, localName = "IsDraggable") + @JsonSerialize(using = NumericBooleanSerializer.class) + private Boolean isDraggable; +} diff --git a/src/main/java/com/alterdekim/game/component/game/home/HomeStuff.java b/src/main/java/com/alterdekim/game/component/game/home/HomeStuff.java new file mode 100644 index 0000000..5c96a6c --- /dev/null +++ b/src/main/java/com/alterdekim/game/component/game/home/HomeStuff.java @@ -0,0 +1,21 @@ +package com.alterdekim.game.component.game.home; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import lombok.AllArgsConstructor; + +import java.util.List; + + +@AllArgsConstructor +@JacksonXmlRootElement(localName = "root") +public class HomeStuff { + @JacksonXmlProperty(isAttribute = false, localName = "inventory") + @JacksonXmlElementWrapper(useWrapping = true, localName = "inventory") + private List inventory; + + @JacksonXmlProperty(isAttribute = false, localName = "locations") + @JacksonXmlElementWrapper(useWrapping = true, localName = "locations") + private List locations; +} diff --git a/src/main/java/com/alterdekim/game/entity/HouseInventory.java b/src/main/java/com/alterdekim/game/entity/HouseInventory.java new file mode 100644 index 0000000..c012aab --- /dev/null +++ b/src/main/java/com/alterdekim/game/entity/HouseInventory.java @@ -0,0 +1,47 @@ +package com.alterdekim.game.entity; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name="house_inventory") +public class HouseInventory { + @jakarta.persistence.Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long Id; + + @OneToOne + @JoinColumn(referencedColumnName = "id") + private User user; + + @Column(nullable = false) + private Long goodId; + + @Column(nullable = false) + private Long homeId; + + @Column(nullable = false) + private Double x; + + @Column(nullable = false) + private Double y; + + @Column(nullable = false) + private Integer frame; + + public HouseInventory(User user, Long goodId, Long homeId, Double x, Double y, Integer frame) { + this.user = user; + this.goodId = goodId; + this.homeId = homeId; + this.x = x; + this.y = y; + this.frame = frame; + } +} diff --git a/src/main/java/com/alterdekim/game/message/amf/AMFDeserializer.java b/src/main/java/com/alterdekim/game/message/amf/AMFDeserializer.java index ba996ed..4c59ea0 100644 --- a/src/main/java/com/alterdekim/game/message/amf/AMFDeserializer.java +++ b/src/main/java/com/alterdekim/game/message/amf/AMFDeserializer.java @@ -104,7 +104,9 @@ public class AMFDeserializer { a.clear(); if( keyLen == 0 ) { endMarker = true; - bytes.remove(); + if( !bytes.isEmpty() ) { + bytes.remove(); + } continue; } bytes.subList(0, Math.min(keyLen, bytes.size())).clear(); diff --git a/src/main/java/com/alterdekim/game/repository/HouseInventoryRepository.java b/src/main/java/com/alterdekim/game/repository/HouseInventoryRepository.java new file mode 100644 index 0000000..835c314 --- /dev/null +++ b/src/main/java/com/alterdekim/game/repository/HouseInventoryRepository.java @@ -0,0 +1,26 @@ +package com.alterdekim.game.repository; + +import com.alterdekim.game.entity.HouseInventory; +import jakarta.transaction.Transactional; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface HouseInventoryRepository extends JpaRepository { + + @Query(value = "SELECT h FROM HouseInventory h WHERE h.user.id = :uid") + List findByUserId(@Param("uid") int userId); + + @Transactional + @Modifying + @Query(value = "UPDATE HouseInventory h SET h.homeId = :houseId, h.x = :x, h.y = :y, h.frame = :frame WHERE h.id = :uid") + void updateInfoById(@Param("uid") Long id, @Param("houseId") Long houseId, @Param("x") Double x, @Param("y") Double y, @Param("frame") Integer frame); + + @Query(value = "SELECT h FROM HouseInventory h WHERE h.user.id = :uid AND h.homeId = :houseId") + List findByUserIdAndHouseId(@Param("uid") Integer userId, @Param("houseId") Long houseId); +} diff --git a/src/main/java/com/alterdekim/game/service/AvatarInventoryService.java b/src/main/java/com/alterdekim/game/service/AvatarInventoryService.java index cf6c567..e640749 100644 --- a/src/main/java/com/alterdekim/game/service/AvatarInventoryService.java +++ b/src/main/java/com/alterdekim/game/service/AvatarInventoryService.java @@ -6,6 +6,8 @@ import com.alterdekim.game.component.game.avatar.IBodyAvatarItem; import com.alterdekim.game.component.game.avatar.BodyPartType; import com.alterdekim.game.component.game.avatar.GoodClothType; import com.alterdekim.game.component.game.avatar.InitMagicAbility; +import com.alterdekim.game.component.game.home.HomeInventoryGroup; +import com.alterdekim.game.component.game.home.HomeInventoryObject; import com.alterdekim.game.component.game.inventory.InventoryGroup; import com.alterdekim.game.component.game.inventory.InventoryItem; import com.alterdekim.game.controller.result.signup.AvatarBodyPart; @@ -227,11 +229,9 @@ public class AvatarInventoryService { .findFirst().orElse(0L); } - public Long getUsedHouse(Integer userId) { + public Optional getUsedHouse(Integer userId) { return this.inventoryRepository.findUsedItemsByUserIdAndType(userId, AvatarInventoryType.House) - .stream() - .map(AvatarInventory::getGoodId) - .findFirst().orElse(0L); + .stream().findFirst(); } public String getAchievementsByUserId(Integer userId) { diff --git a/src/main/java/com/alterdekim/game/service/HomeInventoryService.java b/src/main/java/com/alterdekim/game/service/HomeInventoryService.java new file mode 100644 index 0000000..f7e22a7 --- /dev/null +++ b/src/main/java/com/alterdekim/game/service/HomeInventoryService.java @@ -0,0 +1,84 @@ +package com.alterdekim.game.service; + +import com.alterdekim.game.component.ReferenceLoader; +import com.alterdekim.game.component.game.AvatarInventoryType; +import com.alterdekim.game.component.game.home.HomeInventoryGroup; +import com.alterdekim.game.component.game.home.HomeInventoryObject; +import com.alterdekim.game.entity.AvatarInventory; +import com.alterdekim.game.entity.Good; +import com.alterdekim.game.entity.HouseInventory; +import com.alterdekim.game.message.amf.AMFObject; +import com.alterdekim.game.repository.AvatarInventoryRepository; +import com.alterdekim.game.repository.GoodRepository; +import com.alterdekim.game.repository.HouseInventoryRepository; +import lombok.extern.slf4j.Slf4j; +import org.javatuples.Pair; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class HomeInventoryService { + + @Autowired + private HouseInventoryRepository houseInventoryRepository; + + @Autowired + private AvatarInventoryRepository avatarInventoryRepository; + + @Autowired + private GoodRepository goodRepository; + + public void addFurnitureToCurrentHome(int userId, Map additions) { + Set ids = additions.keySet(); + long houseId = getCurrentHouseId(userId); + for( String id : ids ) { + Map obj = (Map) additions.get(id).getRaw(); + Integer frame = obj.containsKey("Frame") ? obj.get("Frame").getInt() : 0; + houseInventoryRepository.updateInfoById(Long.parseLong(id), houseId, obj.get("x").getDouble(), obj.get("y").getDouble(), frame); + } + } + + private long getCurrentHouseId(int userId) { + return avatarInventoryRepository.findUsedItemsByUserIdAndType(userId, AvatarInventoryType.House).stream() + .findFirst() + .map(AvatarInventory::getId) + .orElse(-1L); + } + + public List getHomeInventoryOfUser(int userId) { + + List groups = this.houseInventoryRepository.findByUserId(userId) + .stream() + .map(HouseInventory::getGoodId) + .distinct() + .map(i -> goodRepository.findById(i)) + .filter(Optional::isPresent) + .map(Optional::get) + .map(i -> new HomeInventoryGroup("1$"+i.getId(), + 1, + i.getId(), + i.getGoodTypeId(), + i.getMRId(), + i.getTRId(), + new ArrayList<>())) + .collect(Collectors.toList()); + + this.houseInventoryRepository.findByUserId(userId) + .forEach(i -> { + for( HomeInventoryGroup group : groups ) { + if( group.getObjectId() == i.getGoodId().longValue() ) { + group.getObject().add(new HomeInventoryObject(i.getId().intValue(), i.getHomeId() != -1)); + break; + } + } + }); + return groups; + } +} diff --git a/src/main/java/com/alterdekim/game/service/LocationService.java b/src/main/java/com/alterdekim/game/service/LocationService.java index 14e8436..3a2be2a 100644 --- a/src/main/java/com/alterdekim/game/service/LocationService.java +++ b/src/main/java/com/alterdekim/game/service/LocationService.java @@ -2,14 +2,8 @@ package com.alterdekim.game.service; import com.alterdekim.game.component.game.PlayerProperties; import com.alterdekim.game.component.game.response.location.LocationObject; -import com.alterdekim.game.entity.Good; -import com.alterdekim.game.entity.HouseLocation; -import com.alterdekim.game.entity.Location; -import com.alterdekim.game.entity.LocationObjectInstance; -import com.alterdekim.game.repository.GoodRepository; -import com.alterdekim.game.repository.HouseLocationRepository; -import com.alterdekim.game.repository.LocationObjectInstanceRepository; -import com.alterdekim.game.repository.LocationRepository; +import com.alterdekim.game.entity.*; +import com.alterdekim.game.repository.*; import com.alterdekim.game.utils.GameUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -17,6 +11,7 @@ import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; @Service public class LocationService { @@ -39,6 +34,9 @@ public class LocationService { @Autowired private UserService userService; + @Autowired + private HouseInventoryRepository houseInventoryRepository; + public List getAllLocationObjects() { return this.locationObjectInstanceRepository.findAll(); } @@ -83,9 +81,24 @@ public class LocationService { public LocationObject getHomeByUserId(Integer userId) { - Long goodId = goodRepository.findById(avatarInventoryService.getUsedHouse(userId)).map(Good::getId).orElse(102L); + Long goodId = avatarInventoryService.getUsedHouse(userId).map(AvatarInventory::getGoodId).orElse(102L); var house = this.houseLocationRepository.findDefaultHouseLocationByGoodId(goodId).get(); - return new LocationObject(GameUtils.convertToSpecialLocation(userId, true), true, false, userService.getBooleanUserProperty(userId, PlayerProperties.IsHomeLocked, true), true, house.getMediaResourceId().longValue(), 300.0, 300.0, "", userId, userService.getUsernameById(userId).get(), Collections.emptyList()); + return new LocationObject(GameUtils.convertToSpecialLocation(userId, true), true, false, userService.getBooleanUserProperty(userId, PlayerProperties.IsHomeLocked, true), true, house.getMediaResourceId().longValue(), 300.0, 300.0, "", userId, userService.getUsernameById(userId).get(), + houseInventoryRepository.findByUserIdAndHouseId(userId, avatarInventoryService.getUsedHouse(userId).map(AvatarInventory::getId).orElse(-1L)) + .stream() + .map(h -> new LocationObjectInstance( + 2, + h.getId().intValue(), + h.getGoodId().intValue(), + goodRepository.findById(h.getGoodId()).get().getMRId().longValue(), + null, + h.getX(), + h.getY(), + "", + "" + )) + .collect(Collectors.toList()) + ); } public void addHouseLocation(HouseLocation house) { diff --git a/src/main/java/com/alterdekim/game/service/UserService.java b/src/main/java/com/alterdekim/game/service/UserService.java index 9241315..e16b369 100644 --- a/src/main/java/com/alterdekim/game/service/UserService.java +++ b/src/main/java/com/alterdekim/game/service/UserService.java @@ -3,6 +3,7 @@ package com.alterdekim.game.service; import com.alterdekim.game.component.game.*; import com.alterdekim.game.component.game.avatar.*; import com.alterdekim.game.component.game.friends.UserFriend; +import com.alterdekim.game.component.game.home.HomeInventoryGroup; import com.alterdekim.game.component.game.inventory.Inventory; import com.alterdekim.game.component.game.inventory.InventoryList; import com.alterdekim.game.component.game.inventory.InventoryTab; @@ -11,6 +12,7 @@ import com.alterdekim.game.component.game.response.init.UserInfo; import com.alterdekim.game.component.game.response.init.UserInitInfo; import com.alterdekim.game.component.game.response.init.UserPhone; import com.alterdekim.game.entity.*; +import com.alterdekim.game.repository.HouseInventoryRepository; import com.alterdekim.game.repository.RoleRepository; import com.alterdekim.game.repository.UserPropertyRepository; import com.alterdekim.game.repository.UserRepository; @@ -53,6 +55,9 @@ public class UserService { @Autowired private IncompatibleService incompatibleService; + @Autowired + private HouseInventoryRepository houseInventoryRepository; + public User findByUsername(String username) { return userRepository.findByUsername(username); @@ -357,5 +362,8 @@ public class UserService { if( !this.inventoryService.isSpecificItemExists(userId, type, goodId) ) { this.inventoryService.addGoodToInventory(new AvatarInventory(userRepository.getReferenceById(userId), goodId, false, type)); } + if( type == AvatarInventoryType.HouseFurniture ) { + houseInventoryRepository.save(new HouseInventory(userRepository.getReferenceById(userId), goodId, -1L, 0.0, 0.0, 0)); + } } }