Defence conversion: rates above 100% aren't scaled down, and a second target reduces the source base twice

Aperta
#2,570 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@Azaril ci sta già lavorando.

Dal 25/10/2026.

  • #2572 di @Azaril — aperta

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
35/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Ferma
Stack tecnologico
lua
Ambito
backend

Direzione di ricerca

Start in src/Modules/CalcDefence.lua, around the conversion scaling loop and the per-target base reduction described in the issue. Trace how conversion and gain-as rates are applied to each source, then run the relevant defence calculation tests and compare both reported builds. Done means rates above 100% are proportionally scaled and adding a gain-as target does not reduce the source base twice; linked PR #2572 indicates work is already underway.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Check version
  • I'm running the latest version of Path of Building and I've verified this by checking the changelog
Check for duplicates
  • I've checked for duplicate open and closed issues by using the search function of the issue tracker
Check for support
  • I've checked that the calculation is supposed to be supported. If it isn't please open a feature request instead (Red text is a feature request).
What platform are you running Path of Building on?

Windows

What is the value from the calculation in-game?

Two conversion rules, both already intended by PoB's conversion code:

  • When a source's conversions total more than 100%, each rate is scaled by 100/total. PoB clamps the total to 100 and has a loop to rescale the rates.
  • A "gain as" rate does not reduce the source. Adding "Gain 20% of maximum Energy Shield as extra Armour" should not change the Energy Shield you keep or the Mana converted from it.

Expected values for the two attached builds (Custom Modifiers only):

  • Build A: 50% of Maximum Life Converted to Energy Shield, plus "Convert 1% of maximum Life to twice as much Armour per 1% Chaos Resistance above 0%" at 75% Chaos Resistance, for 125% in total. The rates scale to 40% and 60%, giving Energy Shield 25 and Armour 84 (60% converted + 75% gained).
  • Build B: Tattered Robe with 128 Energy Shield, "Convert 40% of maximum Energy Shield to maximum Mana" and "Gain 20% of maximum Energy Shield as extra Armour". Expected Energy Shield 77, Armour 26, Mana 104, the same Energy Shield and Mana as with the Mana conversion alone.
What is the value from the calculation in Path of Building?
  • Build A: Energy Shield 31 and Armour 93. The rates are not scaled, so 125% of Life is handed out while Life drops to 1.
  • Build B: Energy Shield 46 and Mana 83. The body armour's Energy Shield is reduced twice (36% kept instead of 60%), and the Mana conversion takes its 40% from the already reduced amount.

Cause (src/Modules/CalcDefence.lua on dev bb52d6b):

  1. Line 1375, for name, val in ipairs(source.conversionRate) do. conversionRate is keyed by target name, so ipairs never iterates and the rates are never scaled down.
  2. Line 1413, source.basePerSlot[slot] = source.basePerSlot[slot] * (100 - source.totalConversion) / 100. This runs inside the per-target loop, so every target with a non-zero rate (conversion or gain-as) reduces the slot base again, and later targets take their share from the reduced base. This also happens when the total is below 100%.

The in-game combinations that reach these paths are uncommon, so both builds use Custom Modifiers. I'll open a PR with a fix and regression tests.

How to reproduce the issue
  1. Import Build A. The Calcs tab shows Energy Shield 31 and Armour 93. Removing either conversion line leaves the other's value unchanged, so nothing is scaled.
  2. Import Build B. The Calcs tab shows Energy Shield 46 and Mana 83. Removing the "Gain 20% of maximum Energy Shield as extra Armour" line gives Energy Shield 77 and Mana 104.
PoB for PoE2 build code
Build A:
eNqtW1tz4joSfs78Cpe3ztPWhEBCMjlF5hQBcqlKMixkZnafphS7AW1kySXJJJxff6ol34CYSGSeMFJ_3a3WpS-ye3-9JixYglRU8IuwfXgUBsAjEVM-vwi_P159_hL-9fVTb0z04tvsMqMMezpfPx30zJ-AqAh4PGBEqQeSwEX4IDiEQbQgkkQa5B0sgfUzLe5FDBehlhn2VuQTwucgw4Ah3UXYDoOEUD4V0TPoaymy1LRpIuegfxRqHv1qh8GSwotl-jgZjcKvnw4OemNGViCnmuhAaaIvwv4SJJnDkCRkDmGwJCyDi_DosNNpn3w5OT7rhq2dwMtMKu2PnqYAcQloH542Uo4ljGYziDRdwkBSPVgQHlWyGnFv0LYPOzvJ7zOmacoomjuHdJrob7a4N_N-FJqw4XhaM9Dxaffk5LzT_nL2DkroCtVE-ZPqxSUDiL1lIPJ2zqmGvaBjQZXge49sDdg4MRljlM-daCegQC6JphtKNfIWyRPle9jtnnAyEMphbpByDDICrr0AU4gEj71leCLv6AzcKb3GkQN8tdlvHKOpK5034_0U-kmkB6WXYXOAjzYTMnec5qnImCOlrk7JsyaiIbxWp2_jbrrl2oXVUuDGfl-zR0mfMg0OhHgOjW7GlYqdw7Pzbvfk5OSs3T390uiSFitFI8LuyStNsuSG6kfyDJVmx-fNK3y-0JzyeRO0026CXlEJ_qiBYPEeqAURqgl2etp8DlF-Q3jcj6JMkmhVQs4bp2BI5DMHpVzPdojdEdOUSlqtrPbRO5Tfucxl7IPJ97ALFM-5im5HiBT9iaS3PHo_3EHCtwawi34CkcAo7omBG2Dv0U5gDjwXt3JzBHcA0eKaUD4hLnsZfWBlpaOdRkXaulF3Mn3DqF1HgIeREPi2kTq7IJ5GGnGQ89V0QYFVozluu5AXeg1I6oA0Zq7Dncy9Ls9rxdShnkZBf-pG5akTel3fYSyJqvu4s90GttRutl2SGDYylubVCAzACzGW4v-YozE_2DQFxvwRe0obwowhTODKoHzujHAV0JeJyKqw6Px45_RZaqfZKyIOm2hPIM6itVioeQsXqfMlE9Gz6zhKlLG2F7SvNYmehyKe-02pF2Jdv2mWphIUbgVXBhhMTUDRWqD7uetA_W0Jsn4CHu2Ku9wFVNTOAspI0l3KBsR9LBgNbohpTo1r1M4Syvm8F0tIgGtTHroXDnHMGJ0tj2BCYpqpe9ASqtDwpHFGM8acKgSG0LFSMRYvIAcLrMQpP-p7UqVJjWfGlQT-98qZ_xq5k4ARjzOJ-8dZxibiLTGX2WymgqdsNrujSl-EYRCJ5Ino8l8mFeR_LOKRJsBAqSHRJIjztO8HkZRw3TbVzo3GjmlUQGS0KNhW_64IY08kes7591qmLotPA8IiZUTe8jTTATcF14Sq6Bfqi7XTMFBamlLv6OpqNHi8_THKtaxD1DNl7BfPkicsHdrfas1Orc8JIsEYSRXEF-GMMAVhQOOLcIrYKaCbCQOVPSlLfRH-oPBiOoegCWXKidsNLYuxdV6GT9XnwuknkZGkuArqjEZJiusWYlwFbiqZEuaWMlYTDItwut0sZWvGdVbW2wyI0ibWc-EyMDlhnQm2uA3lNkkJ2zBt3uY81Y-rFKzxto2iVymoFCI6o5G7gWul6DXbFFm4Cw9TPl7H2yYXsC0Dr6PzNiermgL0hlVtm9P6gois1tG2yQVc5grrDMpmwW-oduI0YtCnDJ3Xxsw-CG4WO-XzksCF4T1VkXWMGwy_6QXIoseFU19rWxJTW7unaHeylSlbrJkJW5zGYrLzOtS0uO16urVj8zanaVlLedeOsnqP44m4wWKScRqZZhd8EUKtcTBtjtOYZxdrU2jbnCxR5JZrRsgbnTaaObL7S0Hj7dNms_PDDE3W8Rv0wrziN7ApU0cnXleMqOeN3Za3NcLtzW8T-rumjOrVx5jgfv0YB9y2H-OAoWLihJ5shTGTncFLhSwD2E3Bc1B748tgd28ONiTfG24yBmfXMYQZ5kVv-Y6y62O8pjrjw0yS3buiGtQ7WjmcHe68rKP1Gqjd__ldx_bRZjs-zojy-Y1rvNnIqUyYb4AwvIcX7GMMNy97HKagkReWO7OU8Ljg9s0nym-2ntCK8Nhkb0Msq6oPaTnikKxqfHqtIh3sDQSf0XlA7Dsn5s8UNCZ0Rl7ZYgTYxvV8MMqUFsm9iFWVP3aP_gjELMgNHeBRHAwEX4LUEAdaBDYeCWxA8invCtoGldRRWgT6hUYQEBUkWbQIbBAQpCCR3BRgAhtY4HYKyJNYQnD0x6d_n3X_QPQmhbWjye8jWAgWg8wHMlhgcoo5ltrKa9-in0ZCRgsfwEJEzx70eOdNcQIHQsosxSruQK6mmpjTsmRw1MwhhkTwKyGTLak7QICLpYi_CsCXo9PjdyDG0kVCXuCOv5y6wIpwsYC9px4WETdFnRfvVe1EjXFvlNo5ADZV676rW-1lrBLkgNkynYsgLJT_BGJuiTcnufMeg7zCLhgzL95VyLN3kcVuchdWhuTlGmyfvWcWLEb7TzOivKa5XiF3nmbzLmNtg3Teoy8q0v4DKqFeo9qqmjsPbf0GxkfTvGxVraMdopLyDcRBJiVwvZ6-VkeVE48hnc0AufSTROCExk5n7BsMriVwEsM-PDBK5ID3x8A1W3miTRVy9V3tz4BiPGjqldHzQGRcT4HNakx2TJ-ic8q-zUzcveViCtig8PV0RkGarDUAju9UlHGIppqBySFJxrSNFw4MuPUG2sQYrTLIsKGJ-YePt0kqpA7gFX_GROpVGT1lCq6BgyQa4lsNySO86lwFE-Bgm8qjGnzOY5pALcQLVhuL2Y5AFZpnCux7Zj-BpIIbBKfMxkE5jzwK2hzlTuxBb8qEDqiG5DZG12Yex0_fJ3dYvLfmt7igtLQHJJi-kNQf19kD4ivqBlgC2gNwKeJVUK_zOKGumVgWiY-jGKF96PtJxrzGMaF87jWZBtDxBRz7jBmYzwhM6cJrCBbR8Ub4DMIUWby0sggfrfqe4-57jvoO_JYG0pf8JxkHg5EZh_o3FooJ_VDbdAFSBv9qewBrm--3oH2Utlt4L7FCb-B6rfy0Nu7EeAJ8ehAazA0othZ_esatBNOFeOnHSwxpH4VgqvQzJE2BV0l7DEpTTvJ6NLOFiJ65zyq8TX7HqfPLW-MgriG5s5-0cCGT8mXaev9_MoI1T-s2jJu6gzmJVteQVNoY75Wl6A6vIcHbNXUR9u_uwkDZJnW5Go6nhUdba7zCsGr9MwBbUcj1zV2bLQ_YEeHjowQoRpZCVBYG8E_9e598_doWwqPVLdcgOWHYkX_kg4-d4rnW3cHvfJQGucpvesziFzGOrnt00j3HK270rkSu-usijbW0BKh9DtTN3e73yZ0NPxZap-rPVuvl5eUwJXohZvBKGRxGImmlRCm6hM_mWvszcmr1-_3-5fwWf_o2cik49eynSCpfnljrkTS2q-rgoFfeMRUdQQyvD3YcYUC5Lp-VlsVzzqu1xqzXQvuaqcAJKCYCr8nz2_6ploZRczzztxDFqju2__5rpgif_pen2L3W1rdc_wAeF4mE

Build B:
eNqtW1tz6jgSfk5-hctb-7R1QiD3U2SmCJCEqiSHgeSc3acpxW5AG1nySjIJ8-u3WrKNgRgkMk_YUn_drdalLzLt3z8SFsxBKir4ddg8Og4D4JGIKZ9ehy_Pt98uw99_O2wPiZ79mNxklGFP67fDg7Z5CYiKgMddRpR6Iglch0-CQxhEMyJJpEE-wBxYJ9PiUcRwHWqZYe-SfET4FGQYMKS7DpthkBDKxyJ6A30nRZaaNk3kFPTPQs3jP5thMKfwbpk-j_r98LfDg4P2kJEFyLEmOlCa6OuwMwdJptAjCZlCGMwJy-A6PD5qtZqnl6cnF2dhYyvwJpNK-6PHKUBcAppH57WUQwn9yQQiTefQlVR3Z4RHS1m1uE9om0etreSPGdM0ZRTNnUNadfT3G9zreT8LTVhvOK4Y6OT87PT0qtW8vNiBEnqJqqP8RfXshgHE3jIQOZhyqmEv6FBQJfjeI1sB1k5MxhjlUyfaESiQc6LpmlK1vEXySvkednsknHSFcpgbpByCjIBrL8AYIsFjbxmeyAc6AXdKr3HkAF9t9htHf-xK5814P4V-EelB6WXYHOCjzYhMHad5LDLmSKmXp-RFHVEPPpanb-1uGnDtwmoucGPv1uxZ0tdMgwMhnkP9-2FJeX56dH520Tq7uji9uDy9qnVJs4WiEWGP5IMmWXJP9TN5g6VmzeZJ_RKfzjSnfFqHvTitg95SCf6ormDxHqgZEaoOdnlZfxBRfk943ImiTJJoUUKuauegR-QbB6VcD3eI3RHjlEq6XFrN4x2UL1zmMvbB5JvYBYoH3XLRbQuSou9IO-DR7oAHCT8ZwflWwAgigYHcKwNHxN4DHsEUeC5v4eYMHgCi2R2hfERc9jP6weUqPdlqVqStmnUr00_MWs9-FeBhJAR-bqSTo63SPM3U5yCni_GMAluO5_TchbzQrEtSB6QxdBXuZPBVeV5rpgr1NAp6VTcqT53Q9_oOY05U1dNdbDewpXaz7ZzEsJa31K9HYABeiKEU_8VMjfnBxikw5o_YU1oPJgxhAlcG5VNnhKuAjkxEVkkht-8PS-00e0XcYdPtEcRZ5BYRlQn0DRPRm-s4SpSxthe0ozWJ3noinvpNqRdiVb9xlqYSFG4FVwYYUY1A0Uq4--3MgfrHHGT1BDzeFny5C1hSOwsow0l3KWsQ97FgSLgmxoXYWUA5nY9iDglwbWpEj6JyLB9dXWwpEyngEYxITDP1CFrCMkKsj6kzxpwqBYbQsWIxFO8guzOsyCk_6keyTJdqPf6tBP7Xwpn_CrmTgD6PM4k7yFnGOuIzMTfZZKKC12wyeaBKX4dhEInklejyLZMK8heLeKYJMFCqRzQJ4jz9-0kkJVw3TdVzrbFlGhUQGc0Ktsu3W8LYK4necv7thqnP4lOXsEgZkQOeZjrgpvCaUBX9ifpiDTUMlJam5Nu_ve13nwc_-7mWVYh6o4z9ybPkFUuI9hd1spRj63WCSDBGUgXxdTghTEEY0Pg6HCN2DOhowkBlr8pSX4c_Kbybzh5oQply4nZPy6JslZfhs-xz4fSLyEhSXAVVRv0kxXULMa4CN5VMKXNDGasJBkY43W6WsrXjKivrb7pEaRPtuXDpmtSwygRb3IYySFLC1kybtzlP9fMiBWu8TaPoRQoqhYhOaORu4EpJesU2RTLuwsOUkVfxtskFbMvBq-i8zcmqphC9ZlXb5rS-ICKLVbRtcgGX2cIqg7JZ8HuqnTj1GXQoQ_-1NrNPgpvFTvm0JHBh-EhVZH3jGsMfegay6HHh1NHalsbUxu4p2p1sZaoXK2bCFqexmAy9CjUtbruebuzYvM1pWlaS3pWjrNrjeCKusRhlnEam2QVfBFErHEyb4zTm-cXKFNo2J0sU2eWKEfJGp41mjuzOXNB487RZ7_wyQ5N3_A16YWbxN7Apk0cnXreMqLe13Za31cLtDXAd-kVTRvXia0xwv36NA27br3HAUDFxQo82wpjR1uBliSwD2HXBU1B748tgd28ONiTfG24yBmfX0YMJ5kWf-Y6y62u8xjrjvUyS7btiOagdWjmcHe68rKP1Gqjd__mVx-bRZju-zojy6b1rvFnLqcyZ74EwvI8X7GsM1-98HKaglhcWPLOU8Ljg9sMnyq-3ntCK8Nhkbz0srKovadnnkCwqfNqNIh1sdwWf0GlA7Lcn5mUMGhM6I69sMQJs42o-GGVKi-RRxGqZP3YFn4PUwenxPwMxCRJr8MBGIYENQwItyg48aQ8xBA1a2xBEBfChJQmqkYBJ1SOYCRaDzHXqzjDPxHRJbaSon9GPIyGjmQ9gJqI3D3q8xqY4F10hZZZiSbYrF2NNzMFXMjiu5xBDIvitkMmG1C0gwHkvQqkCcHl8frIDYkpbRW5d4E4uz11gReRXwHaphxXBdVFXxfXcVtQQl3mpnQNgXbWznbpVvq8qQQ6YDdO5CMKq9y8g5t53fZJbuxjk5XLBmPmWbom82ImkSq-OcKewMrou12DzYpdZsLLsP82I8prmarnbeZrN54mVDdLaRV-Ul_0HVEK9RrVRAnce2up1io-meQVquY62iErKjwq7mZTA9WomujyqnHj06GQCyKWTJAInNHY6Yz9hcCeBkxj24YEBHwe8DAau2cITbQqKixe1PwOKoZ0pPUZvXZFxPQY2qTDZMn2KTin7MTEh9IaLKWDdwm3TCQVpEtAAOH4jUYYUmmoGJh0kGdPW9R8YcOMTtAkXGmW8YKMM84aPgyQVUgfwgT9DIvWiDIQyBXfAQRIN8UBD8gwfOlfBxCrYpvIABZ_z8CRQM_GOhcNitiNQheaZAvvp2C8gqeAGwSmzIQ3yqEYzIyKpXnwPXp4Gf7z0D5_gPUCSw2eiNU5BMBKvcLgSiXwPmq3Lwz8ywgzy-NCcICP4Hz4PkpTRiGqFL_9qHh9XI50VNsaWjyI2R3auUiDxBe-Bii9UGqhNqfkyFFufn62jPmiPmdAB1ZAMYnTK5nH4-jJ6wBsEu3AsLijXiAckGL-T1B_X2gPiK-oeWAL6U0DzU8CNiBdrIaaDmDsm5kX25QS4EUL70HeSjNWM43PAiPKp12QaQMsXcOIzZmA-IzD1E68hWETLG-EzCFPp8dLKIny06niOu-M56gfwWxpIX_IfZRwMRmYcqn_4UEzop8qmC5Ay-EfTA1jZfH8L2kdpu4X3Eiv0Gs4e24UjND4Mn56EBnMNi63FS9s4xGA8E--deI7B-LMQTJUekqQp8GXlIAalKSd5UZzZakjbXKoVfjK_aNX5DbJxEHeQPNj_13Ahk_LL3mp_7tGs2zAO9gGmJFrcQbLUxvjdLEVHfgcJXvGp67Dz8BAGyjapm0VvOC588UrjLbq91f8k2LJGrm_u2myNwo4IH58lQDGyFKKyOoEv1T8f5evXthAeLQZcg-SEYUf-jyN8bBXPle4W_ulIaZCL_LrJLH4R4-jOjk_PrvCeHb0rkYvOqkhjLS0BKv9NOsvd7svowQZOM61T9b3ReH9_P0qJnokJfFAGR5FIGilRis7hm7lb_4acGp1Op3MzHeBPx8ZcBae2_V-UypcnFpwkje2qOjholxddRUcQw8eTHUcYUK7LZ6Vl8ZzzaqwwazfQvmYqcAKKicC7-vyTg7GWhlF9JPaXEMWqO7Fv_zZThE__yYsD7cbGH8v-D6XvsSc=
Screenshots

No response

Lingua principale
Lua
Stelle
1.9k
Fork
461
Merge medio
1h 2m
PR unite (30g)
1

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di PathOfBuildingCommunity/PathOfBuilding-PoE2

Tutte le issue di PathOfBuildingCommunity/PathOfBuilding-PoE2

Issue simili

Altre issue su Lua

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.