Skip to content

Commit 81ca510

Browse files
committed
update
1 parent f937d67 commit 81ca510

File tree

11 files changed

+27
-39
lines changed

11 files changed

+27
-39
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ These can be used normally for sims, and if installed also for mannequins (usual
6666
* TYAE Female: Abény, Anok, Asha, Ashley, Clémentine, Divya, Hye-Jeong, Jenna, Nayla, Suzie, Yoon Young
6767
* TYAE Male: A$AP, Dijbril, Jacob&Barry
6868
* Child Female: 18, 19, 22, 23
69-
* Chile Male: 17, 19, 23, 24
69+
* Child Male: 17, 19, 23, 24
7070
* Dark Pink:
7171
* TYAE Female: Miami Skin V1
7272
* JaySims

_TS4/Mods/_o19_/copy_outfits.package

48 Bytes
Binary file not shown.

_TS4/mod_documentation/copy_outfits/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ These can be used normally for sims, and if installed also for mannequins (usual
6666
* TYAE Female: Abény, Anok, Asha, Ashley, Clémentine, Divya, Hye-Jeong, Jenna, Nayla, Suzie, Yoon Young
6767
* TYAE Male: A$AP, Dijbril, Jacob&Barry
6868
* Child Female: 18, 19, 22, 23
69-
* Chile Male: 17, 19, 23, 24
69+
* Child Male: 17, 19, 23, 24
7070
* Dark Pink:
7171
* TYAE Female: Miami Skin V1
7272
* JaySims
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
1-
CopyOutfits v1.9.0 for The Sims 4 v1.107.151 and S4CL v3.4
2-
Created on 2024-07-04
3-
v1.9.0
4-
Experimental support for mannequins
5-
TS4lib requires an update.
6-
This mod doesn't create a new outfit (dress the mannequin) when replacing the 'bathing' outfit.
7-
Most useful interactions: 'Clone > Everything', 'Mannequin > Skins | Add'
8-
'Clone > Characteristics' may require a 'Reset' to apply these.
9-
Allow to add non-existing outfits to sims.
10-
Allow to de-/spawn mannequins on the floor, also off-lot.
11-
Fixed Age.PET
12-
Added Age.HORSE
13-
Added X-OutfitCategory.SPECIAL[FASHION]
14-
Outfit order is now: BATHING; SITUATION; CAREER.[0-2]; SPECIAL.[DEFAULT,TOWEL,FASHION]; BATUU.[0-4] with picker hint notification.
15-
Address exception "_on_outfit_change() 'missing 2 required positional arguments: 'sim_info_wrapper' and 'outfit_category_and_index'" within a 3rd party mod.
1+
CopyOutfits v1.9.3 for The Sims 4 v1.107.151 and S4CL v3.4
2+
Created on 2024-07-09
3+
v1.9.3
4+
Add outfits instead replacing .0
165

copy_outfits/config/config_reader.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def _parse_dict(self, d: Dict) -> Dict:
5656
elif isinstance(v, str):
5757
if re.match(r"([A-Z][A-Za-z]*\.[A-Z_]*)", v):
5858
class_name, _, value = v.partition('.')
59-
if not class_name in self.classes.keys():
59+
if class_name not in self.classes.keys():
6060
""" Here we could dynamically locate the enum class and add it to classes with importlib """
6161
if class_name in self.classes.keys():
6262
value = getattr(self.classes.get(class_name), value).value

copy_outfits/copy_outfits_mannequin.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def change_mannequin(self, zim: CopyOutfitsSim, interaction_sim: Sim, interactio
6161
elif zim.action_id in [PieMenuActionId.MANNEQUIN_ROTATE_ZERO, PieMenuActionId.MANNEQUIN_ROTATE_LEFT, PieMenuActionId.MANNEQUIN_ROTATE_RIGHT, ]:
6262
self.rotate_mannequin(zim, interaction_target)
6363

64-
elif zim.action_id in [PieMenuActionId.MANNEQUIN_REMOVE, ]:
64+
elif zim.action_id in [PieMenuActionId.MANNEQUIN_REMOVE, ]:
6565
self.destroy_mannequin(zim, interaction_target)
6666

6767
def rotate_mannequin(self, zim: CopyOutfitsSim, interaction_target: Any):
@@ -182,7 +182,8 @@ def add_mannequin(self, zim: CopyOutfitsSim, interaction_sim: Sim, interaction_t
182182
mannequin_component = zim.mannequin_component = game_object.mannequin_component
183183
sim_info = zim.sim_info = getattr(zim.mannequin_component, '_sim_info_data', None)
184184

185-
outfit_category = zim.outfit_category = random.randint(OutfitCategory.EVERYDAY.value, OutfitCategory.BATUU.value) # (OutfitCategory.EVERYDAY.value, OutfitCategory.PARTY.value)== 5 = safe; (OutfitCategory.EVERYDAY.value, OutfitCategory.BATUU.value) # 13 risky
185+
# TODO (OutfitCategory.EVERYDAY.value, OutfitCategory.PARTY.value)== 5 = safe; (OutfitCategory.EVERYDAY.value, OutfitCategory.BATUU.value) # 13 risky
186+
outfit_category = zim.outfit_category = random.randint(OutfitCategory.EVERYDAY.value, OutfitCategory.BATUU.value)
186187
maximum_outfits = get_maximum_outfits_for_category(zim.outfit_category)
187188
outfit_index = zim.outfit_index = random.randint(0, maximum_outfits - 1)
188189

copy_outfits/main.py

+3-12
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,6 @@ def clone_cas_parts(self, zim: CopyOutfitsSim):
189189
outfit_category = zim.outfit_category
190190
outfit_index = zim.outfit_index
191191
clipboard_index = 0
192-
# outfit_name = zim.outfit_name
193-
mannequin_component = zim.mannequin_component
194192

195193
new_parts = CopyOutfitUtilities().get_parts_from_clipboard(sim_age, clipboard_index)
196194
if not new_parts:
@@ -371,12 +369,12 @@ def paste_outfit(self, zim: CopyOutfitsSim):
371369
self.open_outfit_picker(zim, action, None, None)
372370
elif action_id == PieMenuActionId.X_PICKER:
373371
occult_type: CommonOccultType = CommonSimOccultTypeUtils.determine_current_occult_type(sim_info)
374-
if zim.sim_age >= CopyOutfitsAge.PET:
372+
if zim.sim_age in [CopyOutfitsAge.PET, CopyOutfitsAge.HORSE, ]:
375373
log.warn(f"Pets, cats, dogs, foxes and/or horses shouldn't have special outfits (not supported by 'Copy Outfits').")
376374
OutfitNotifications().show_notification(f"Animals have no special outfits.")
377375
return True
378-
if CommonOccultType.MERMAID == occult_type or CommonOccultType.ALIEN == occult_type:
379-
log.warn(f"Occult '{occult_type}' might have no special outfits. Expect than an unexpected exception gets thrown.")
376+
if occult_type in [CommonOccultType.MERMAID, CommonOccultType.ALIEN, ]:
377+
log.warn(f"Occult '{occult_type}' might have no special outfits. Expect an 'unexpected'000ffffffff exception.")
380378
OutfitNotifications().show_notification(f"Categories: All | Bathing.0 | Situation.0 | Career.0-2 | Special.0/Towel/Fashion | Batuu.0-4 .")
381379
self.open_outfit_picker(
382380
zim,
@@ -401,13 +399,6 @@ def paste_outfit(self, zim: CopyOutfitsSim):
401399
OutfitNotifications().show_notification(f"No outfit found in clipboard [{clipboard_index}].")
402400

403401
def copy_outfit(self, zim: CopyOutfitsSim):
404-
r'''
405-
self.action = PieMenuAction(_action)
406-
self.action_id = PieMenuActionId(_action_id)
407-
self.group_id = OutfitGroupId(_group_id)
408-
@param zim:
409-
@return:
410-
'''
411402
sim_info = zim.sim_info
412403
sim_age = zim.sim_age
413404
sim_id = zim.sim_id

copy_outfits/modinfo.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def _file_path(self) -> str:
2828

2929
@property
3030
def _version(self) -> str:
31-
return '1.9.0'
31+
return '1.9.3'
3232

3333

3434
r'''
@@ -43,14 +43,20 @@ def _version(self) -> str:
4343
Load and Save outfits
4444
Read config files / support user defined skins
4545
46+
v1.9.3
47+
Add outfits instead replacing .0
48+
v1.9.2
49+
Cleanup coe style
50+
v1.9.1
51+
Fix menu order within 'Rotate'
4652
v1.9.0
4753
Experimental support for mannequins
4854
TS4lib requires an update.
4955
This mod doesn't create a new outfit (dress the mannequin) when replacing the 'bathing' outfit.
5056
Most useful interactions: 'Clone > Everything', 'Mannequin > Skins | Add'
5157
'Clone > Characteristics' may require a 'Reset' to apply these.
5258
Allow to add non-existing outfits to sims.
53-
Allow to de-/spawn mannequins on the floor, also off-lot.
59+
Allow to de-/spawn mannequins on terrain, also off-lot.
5460
Fixed Age.PET
5561
Added Age.HORSE
5662
Added X-OutfitCategory.SPECIAL[FASHION]

copy_outfits/outfit_add.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def add_outfits(zim: CopyOutfitsSim) -> int:
7272
else:
7373
tag_list = (CommonGameTag.OUTFIT_CATEGORY_BATHING, )
7474

75-
CommonOutfitUtils.generate_outfit(sim_info, (outfit_category, 0), tag_list)
75+
CommonOutfitUtils.generate_outfit(sim_info, (outfit_category, outfit_index), tag_list)
7676
num_outfits_created += 1
7777

7878
log.debug(f"Added {num_outfits_created} '{outfit_category}' outfits to '{zim.sim_info}'")

copy_outfits/outfit_skin.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ def __init__(self):
8181
},
8282
}
8383
self.skin_store = SkinStore(self.config)
84-
# A78520CC00C7191C
84+
85+
# A78520CC00C7191C
8586
def apply_skin(self, zim: CopyOutfitsSim):
8687
sim_info = zim.sim_info
8788
outfit_category = zim.outfit_category

copy_outfits/struct/copy_outfits_sim.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def __init__(self, interaction_target: Union[SimInfo, MannequinComponent, Any],
3636
self.sim_info: Union[SimInfo, SimInfoBaseWrapper, None] = None
3737
self.sim_id: int = CopyOutfitsMannequin.SIM_ID_NONE.value
3838
self.sim_age: CopyOutfitsAge = CopyOutfitsAge.UNKNOWN
39-
self.is_female: bool = None
39+
self.is_female: Union[bool, None] = None
4040
self.mannequin_component: Union[MannequinComponent, None] = None
4141
self.sim_name = 'Unknown#Unknown'
4242
self.outfit_name = 'Unknown'
@@ -60,7 +60,7 @@ def __init__(self, interaction_target: Union[SimInfo, MannequinComponent, Any],
6060
if f"{interaction_target}".startswith('object_Mannequin'):
6161
self.mannequin_component = interaction_target.mannequin_component
6262
self.sim_info = getattr(self.mannequin_component, '_sim_info_data', None)
63-
self.sim_name = 'Mannequin'
63+
self.sim_name = 'Mannequin#Mannequin'
6464

6565
if f"{interaction_target}".startswith('object_Mannequin_Adult'):
6666
self.sim_id = CopyOutfitsMannequin.SIM_ID_MANNEQUIN_ADULT
@@ -88,7 +88,7 @@ def __init__(self, interaction_target: Union[SimInfo, MannequinComponent, Any],
8888
self.sim_info = None
8989
self.sim_id = CopyOutfitsMannequin.SIM_ID_NONE.value
9090
self.sim_age = CopyOutfitsAge.UNKNOWN
91-
self.is_female: bool = None
91+
self.is_female: Union[bool, None] = None
9292
self.sim_name = 'Terrain#Terrain'
9393
self.outfit_name = 'Terrain'
9494
log.debug(f"TerrainPoint, setting only '{self.action}' and '{self.action_id}'")

0 commit comments

Comments
 (0)