

and thank you btw i could find some rly cool effects like this one <3If it's simple, then take the ItemRefineInfo.txt and ItemRefineEffectInfo.txt files from another client that has a glow. If it's complicated, then read the following spoiler:
# CItemRefineSet and CItemRefineEffectSet Tables
Two client-side loadable tables that control **visual effects for weapons and equipment** during forging and gem enhancement. They define item texture glow and particle attachment to the model.
---
## 1. CItemRefineSet (ItemRefineInfo)
### Purpose
Maps **item ID** to a set of **effect IDs** and **scales** for different character types. Indexed by item ID (nItemID).
### Data Source
- **File:** `scripts/table/ItemRefineInfo` (txt/bin)
- **Loading:** `GameAppInterface.cpp`, during client initialization
- **ID range:** 0 … `g_Config.m_nMaxItemType`
### CItemRefineInfo Structure
| Field | Type | Description |
|-------|------|-------------|
| `Value[14]` | short[ITEM_REFINE_NUM] | 14 effect indices. Each index is an ID of a record in ItemRefineEffectInfo. The index is chosen based on gem type combination (see Lua `Item_Stoneeffect`). |
| `fChaEffectScale[4]` | float[4] | Particle scale for 4 character types (Lance, Carsise, Phyllis, Ami). Used in `SetForgeEffect` when creating effects. |
### Table Format (ItemRefineInfo.txt)
- **Columns 1–14:** `Value[0]` … `Value[13]` — effect IDs from ItemRefineEffectInfo
- **Columns 15–18:** `fChaEffectScale[0]` … `fChaEffectScale[3]`
Example row:
```
4 Serpentine Sword 3 9 0 12 26 0 25 0 24 0 0 27 0 0 0.6 1.0 1.0 0.7
```
- Item ID: 4
- Value: 3, 9, 0, 12, 26, 0, 25, 0, 24, 0, 0, 27, 0, 0
- fChaEffectScale: 0.6, 1.0, 1.0, 0.7
---
## 2. CItemRefineEffectSet (ItemRefineEffectInfo)
### Purpose
Defines a **specific visual effect**: texture glow ID and particle IDs for each character type and attachment point (dummy).
### Data Source
- **File:** `scripts/table/ItemRefineEffectInfo` (txt/bin)
- **Loading:** `GameAppInterface.cpp`
- **ID range:** 0 … 5000
### CItemRefineEffectInfo Structure
| Field | Type | Description |
|-------|------|-------------|
| `nLightID` | int | Texture glow set ID (ItemLit). 0 = no glow. Used in `LitResetTexture(item_id, level)`. |
| `sEffectID[4][4]` | short[REFINE_EFFECT_CHA_NUM][REFINE_EFFECT_NUM] | 4×4 matrix: [character type][effect slot] → base effect ID. Final ID = `sEffectID * 10 + Level` (Level 0–3). |
| `chDummy[4]` | char[4] | Item model dummy bone indices for particle attachment (0–5, etc.). |
| `_sEffectNum[4]` | int[4] (private) | Number of active effects per character type (computed at load time). |
### Table Format (ItemRefineEffectInfo.txt)
- **Column 1:** Record ID
- **Column 2:** Name (not used in code)
- **Column 3:** nLightID (Glow ID)
- **Columns 4–7:** Effect ID 1 for Lance, Carsise, Phyllis, Ami
- **Column 8:** Dummy 1
- **Columns 9–12:** Effect ID 2 for four characters
- **Column 13:** Dummy 2
- … same pattern for Effect 3 and 4
Example:
```
1 Staff Bonus 3 0 0 300 300 4 0 0 301 301 4 0 0 302 302 0 0 0 0 0 0
```
- nLightID = 3
- Effects: 300, 301, 302 for Phyllis/Ami, dummy 4
---
## 3. Usage Chain
### 3.1. Effect Selection by Gems
Lua function `Item_Stoneeffect(Stone_Type1, Stone_Type2, Stone_Type3)` returns 1–14 (or 0 if no effect). This is the index into the `Value[]` array of ItemRefineInfo.
Gem types are defined in `CStoneInfo::nType`. Combinations determine which of the 14 effect slots to use (single type, two types, three types, etc.).
### 3.2. Data Retrieval in Code
```
SItemForge::Refresh(nItemID):
1. Item_Stoneeffect(nStoneType[0], nStoneType[1], nStoneType[2]) → nEffectID (1-based)
2. nEffectID-- (convert to 0-based)
3. pRefineInfo = GetItemRefineInfo(nItemID) // by item ID
4. pEffectInfo = GetItemRefineEffectInfo(pRefineInfo->Value[nEffectID]) // by effect ID
5. nEffectLevel = (nLevel - 1) / 4 // 0–3 by forge level
```
### 3.3. Applying the Effect (CSceneItem::SetForgeEffect)
1. **Texture glow:**
`LitResetTexture(pInfo->nLightID, Level)` — replace item texture with animated glow by level (0–3).
2. **Particles:**
For each active effect:
- `nEffectID = pInfo->sEffectID[nCharID] * 10 + Level`
- `pEffect->Create(nEffectID)` — create effect
- `pEffect->setFollowObj(pItem, NODE_ITEM, pInfo->chDummy)` — attach to dummy
- `pEffect->SetScale(Forge.pRefineInfo->fChaEffectScale[nCharID], ...)` — scale from ItemRefineInfo
- `pEffect->SetAlpha(SItemForge::GetAlpha(Forge.nLevel))` — alpha by forge level
---
## 4. Constants
| Constant | Value | Description |
|----------|-------|-------------|
| `ITEM_REFINE_NUM` | 14 | Number of effect slots in ItemRefineInfo |
| `REFINE_EFFECT_NUM` | 4 | Maximum particles per effect |
| `REFINE_EFFECT_CHA_NUM` | 4 | Number of character types (Lance, Carsise, Phyllis, Ami) |
---
## 5. Code Usage
| File | Usage |
|------|-------|
| `SceneItem.cpp` | `SetForgeEffect` — glow and particles on world items |
| `GameAppMsg.cpp` | Handling `left/right` and `forge` commands — effects on character equipment |
| `UIItemCommand.cpp` | `SItemForge::Refresh`, `GetForgeInfo` — hints and forge level display |
| `GameAppInterface.cpp` | Table loading, binary export |
---
## 6. Relation to Other Systems
- **ItemLit (lwItemLit):** glow textures by `nLightID` and level
- **CEffectObj:** particles by `sEffectID * 10 + Level`
- **CStoneSet / CStoneInfo:** gem types for `Item_Stoneeffect`
- **SItemForge:** structure combining forge, gem, and effect data

figured out how to fix the sword glows for +9/+13?and thank you btw i could find some rly cool effects like this one <3
View attachment 304
Not yet, it has the 4 different glow tiers on 1 5 9 13, but they look different. I looked up and could not find the effects on the game client. I've spent two days brute forcing the effects and still didn't find the correct effect. My theory is that this game client just doesnt have them and I don't know another client i can usefigured out how to fix the sword glows for +9/+13?
same! I copied from a working client from different server files which had glows working perfectly and it still remained the same...to add more, i noticed glow effects (weapons, cloaks) sometimes stop rendering fully, and i have to un-equip, then re-equip the item. Especially when more than 1 players are next to each other. maybe memory leak? but those are my biggest things I've encountered. but it's a great learning resource for sure overall!Not yet, it has the 4 different glow tiers on 1 5 9 13, but they look different. I looked up and could not find the effects on the game client. I've spent two days brute forcing the effects and still didn't find the correct effect. My theory is that this game client just doesnt have them and I don't know another client i can use
a little bit off topic for this thread...but after creating an effect for a weapon(new weapon glow) how is that .eff file changed into a .par file to add it to scene effect?If it's simple, then take the ItemRefineInfo.txt and ItemRefineEffectInfo.txt files from another client that has a glow. If it's complicated, then read the following spoiler:
# CItemRefineSet and CItemRefineEffectSet Tables
Two client-side loadable tables that control **visual effects for weapons and equipment** during forging and gem enhancement. They define item texture glow and particle attachment to the model.
---
## 1. CItemRefineSet (ItemRefineInfo)
### Purpose
Maps **item ID** to a set of **effect IDs** and **scales** for different character types. Indexed by item ID (nItemID).
### Data Source
- **File:** `scripts/table/ItemRefineInfo` (txt/bin)
- **Loading:** `GameAppInterface.cpp`, during client initialization
- **ID range:** 0 … `g_Config.m_nMaxItemType`
### CItemRefineInfo Structure
| Field | Type | Description |
|-------|------|-------------|
| `Value[14]` | short[ITEM_REFINE_NUM] | 14 effect indices. Each index is an ID of a record in ItemRefineEffectInfo. The index is chosen based on gem type combination (see Lua `Item_Stoneeffect`). |
| `fChaEffectScale[4]` | float[4] | Particle scale for 4 character types (Lance, Carsise, Phyllis, Ami). Used in `SetForgeEffect` when creating effects. |
### Table Format (ItemRefineInfo.txt)
- **Columns 1–14:** `Value[0]` … `Value[13]` — effect IDs from ItemRefineEffectInfo
- **Columns 15–18:** `fChaEffectScale[0]` … `fChaEffectScale[3]`
Example row:
```
4 Serpentine Sword 3 9 0 12 26 0 25 0 24 0 0 27 0 0 0.6 1.0 1.0 0.7
```
- Item ID: 4
- Value: 3, 9, 0, 12, 26, 0, 25, 0, 24, 0, 0, 27, 0, 0
- fChaEffectScale: 0.6, 1.0, 1.0, 0.7
---
## 2. CItemRefineEffectSet (ItemRefineEffectInfo)
### Purpose
Defines a **specific visual effect**: texture glow ID and particle IDs for each character type and attachment point (dummy).
### Data Source
- **File:** `scripts/table/ItemRefineEffectInfo` (txt/bin)
- **Loading:** `GameAppInterface.cpp`
- **ID range:** 0 … 5000
### CItemRefineEffectInfo Structure
| Field | Type | Description |
|-------|------|-------------|
| `nLightID` | int | Texture glow set ID (ItemLit). 0 = no glow. Used in `LitResetTexture(item_id, level)`. |
| `sEffectID[4][4]` | short[REFINE_EFFECT_CHA_NUM][REFINE_EFFECT_NUM] | 4×4 matrix: [character type][effect slot] → base effect ID. Final ID = `sEffectID * 10 + Level` (Level 0–3). |
| `chDummy[4]` | char[4] | Item model dummy bone indices for particle attachment (0–5, etc.). |
| `_sEffectNum[4]` | int[4] (private) | Number of active effects per character type (computed at load time). |
### Table Format (ItemRefineEffectInfo.txt)
- **Column 1:** Record ID
- **Column 2:** Name (not used in code)
- **Column 3:** nLightID (Glow ID)
- **Columns 4–7:** Effect ID 1 for Lance, Carsise, Phyllis, Ami
- **Column 8:** Dummy 1
- **Columns 9–12:** Effect ID 2 for four characters
- **Column 13:** Dummy 2
- … same pattern for Effect 3 and 4
Example:
```
1 Staff Bonus 3 0 0 300 300 4 0 0 301 301 4 0 0 302 302 0 0 0 0 0 0
```
- nLightID = 3
- Effects: 300, 301, 302 for Phyllis/Ami, dummy 4
---
## 3. Usage Chain
### 3.1. Effect Selection by Gems
Lua function `Item_Stoneeffect(Stone_Type1, Stone_Type2, Stone_Type3)` returns 1–14 (or 0 if no effect). This is the index into the `Value[]` array of ItemRefineInfo.
Gem types are defined in `CStoneInfo::nType`. Combinations determine which of the 14 effect slots to use (single type, two types, three types, etc.).
### 3.2. Data Retrieval in Code
```
SItemForge::Refresh(nItemID):
1. Item_Stoneeffect(nStoneType[0], nStoneType[1], nStoneType[2]) → nEffectID (1-based)
2. nEffectID-- (convert to 0-based)
3. pRefineInfo = GetItemRefineInfo(nItemID) // by item ID
4. pEffectInfo = GetItemRefineEffectInfo(pRefineInfo->Value[nEffectID]) // by effect ID
5. nEffectLevel = (nLevel - 1) / 4 // 0–3 by forge level
```
### 3.3. Applying the Effect (CSceneItem::SetForgeEffect)
1. **Texture glow:**
`LitResetTexture(pInfo->nLightID, Level)` — replace item texture with animated glow by level (0–3).
2. **Particles:**
For each active effect:
- `nEffectID = pInfo->sEffectID[nCharID] * 10 + Level`
- `pEffect->Create(nEffectID)` — create effect
- `pEffect->setFollowObj(pItem, NODE_ITEM, pInfo->chDummy)` — attach to dummy
- `pEffect->SetScale(Forge.pRefineInfo->fChaEffectScale[nCharID], ...)` — scale from ItemRefineInfo
- `pEffect->SetAlpha(SItemForge::GetAlpha(Forge.nLevel))` — alpha by forge level
---
## 4. Constants
| Constant | Value | Description |
|----------|-------|-------------|
| `ITEM_REFINE_NUM` | 14 | Number of effect slots in ItemRefineInfo |
| `REFINE_EFFECT_NUM` | 4 | Maximum particles per effect |
| `REFINE_EFFECT_CHA_NUM` | 4 | Number of character types (Lance, Carsise, Phyllis, Ami) |
---
## 5. Code Usage
| File | Usage |
|------|-------|
| `SceneItem.cpp` | `SetForgeEffect` — glow and particles on world items |
| `GameAppMsg.cpp` | Handling `left/right` and `forge` commands — effects on character equipment |
| `UIItemCommand.cpp` | `SItemForge::Refresh`, `GetForgeInfo` — hints and forge level display |
| `GameAppInterface.cpp` | Table loading, binary export |
---
## 6. Relation to Other Systems
- **ItemLit (lwItemLit):** glow textures by `nLightID` and level
- **CEffectObj:** particles by `sEffectID * 10 + Level`
- **CStoneSet / CStoneInfo:** gem types for `Item_Stoneeffect`
- **SItemForge:** structure combining forge, gem, and effect data

Maybe it’ll help someone.I could not find a way to fix the glows in this file, all glows seems to be capped at the +6 or +9 glows forever, those swords are +27, anyone know how can i unlock the other glows? like the wave effects.
View attachment 296
View attachment 297
that fix the glow intensity, but not the particle that glows inside the weapon... but thanks!Maybe it’ll help someone.
The problem was not the refinement level, missing resources, or missing effect layers.
Apparel weapons do not have their own refinement level. The client correctly reads the forge value from the equipped base weapon. Runtime diagnostics confirmed:
The actual problem was the character-specific effect scale from ItemRefineInfo.txt.
- +13 or higher selected the maximum tier: effect_level = 3
- Alpha was 1.0
- The correct effect was loaded
- All 15 sub-effects were rendered:
- 4 Cylinder
- 5 RectPlane
- 6 Rect
Most records use these four character scales:
0.6 1.0 1.0 0.7
For character type 1, the complete 15-layer forge effect was rendered at only 0.6 scale. As a result, a complete +13 effect looked more like a +3 or +6 glow.
File to modify
Apply the fix in:
Client/src/SceneItem.cpp
In some source trees, the path may be:
sources/Client/src/SceneItem.cpp
Add this helper near the top of SceneItem.cpp, after the includes:
namespace<br>{<br>constexpr std::array<float, 4> ForgeCharacterScaleBaseline{<br> 0.6f, 1.0f, 1.0f, 0.7f<br>};<br><br>[[nodiscard]] constexpr float NormalizeForgeEffectScale(<br> const float authoredScale,<br> const int characterIndex) noexcept<br>{<br> if (characterIndex < 0 ||<br> static_cast<std::size_t>(characterIndex) >=<br> ForgeCharacterScaleBaseline.size())<br> {<br> return authoredScale;<br> }<br><br> const float baseline =<br> ForgeCharacterScaleBaseline[<br> static_cast<std::size_t>(characterIndex)];<br><br> return baseline > 0.0f<br> ? authoredScale / baseline<br> : authoredScale;<br>}<br>}
Then find:
void CSceneItem::SetForgeEffect(DWORD value, int nCharID)
Inside the effect creation loop, replace:
float fEffectScale =<br> Forge.pRefineInfo->fChaEffectScale[nCharID];<br><br>pEffect->SetScale(<br> fEffectScale,<br> fEffectScale,<br> fEffectScale);
with:
const float authoredEffectScale =<br> Forge.pRefineInfo->fChaEffectScale[nCharID];<br><br>const float effectiveEffectScale =<br> NormalizeForgeEffectScale(<br> authoredEffectScale,<br> nCharID);<br><br>pEffect->SetScale(<br> effectiveEffectScale,<br> effectiveEffectScale,<br> effectiveEffectScale);
For the standard character values, the result becomes:
0.6 / 0.6 = 1.0<br>1.0 / 1.0 = 1.0<br>1.0 / 1.0 = 1.0<br>0.7 / 0.7 = 1.0
This fixes the common forge-effect path instead of modifying individual apparel or weapon records. Custom per-item scale differences are preserved as relative multipliers.
Do not modify the refinement tier calculation. The original logic is correct:
effectLevel = (totalLevel - 1) / 4;<br><br>if (effectLevel > 3)<br> effectLevel = 3;
The tiers are:
+1–4 = tier 0<br>+5–8 = tier 1<br>+9–12 = tier 2<br>+13+ = tier 3
After applying this change, maximum-level forge effects display at the correct size on apparel weapons.