@@ -26,6 +26,84 @@ class LootSheet5eNPCHelper {
26
26
} )
27
27
return currency
28
28
}
29
+
30
+ /**
31
+ * Shared code for distributing coins so it can be called both from socket and as GM
32
+ * @param {Actor5e } containerActor - The actor who is initiating the distribution of coins
33
+ * @returns
34
+ */
35
+ static distributeCoins ( containerActor ) {
36
+ let observers = [ ]
37
+ let players = game . users . players
38
+
39
+ // Calculate observers
40
+ for ( let player of players ) {
41
+ let playerPermission = LootSheet5eNPCHelper . getLootPermissionForPlayer ( containerActor , player )
42
+ if ( player != 'default' && playerPermission >= 2 ) {
43
+ if ( player . character != null && ( player . role === 1 || player . role === 2 ) )
44
+ observers . push ( player . character )
45
+ }
46
+ }
47
+
48
+ if ( observers . length === 0 ) return
49
+
50
+ // Calculate split of currency
51
+ let currencySplit = foundry . utils . duplicate (
52
+ LootSheet5eNPCHelper . convertCurrencyFromObject ( containerActor . system . currency ) ,
53
+ )
54
+
55
+ // keep track of the remainder
56
+ let currencyRemainder = { }
57
+
58
+ for ( let c in currencySplit ) {
59
+ if ( observers . length ) {
60
+ // calculate remainder
61
+ currencyRemainder [ c ] = currencySplit [ c ] % observers . length
62
+
63
+ currencySplit [ c ] = Math . floor ( currencySplit [ c ] / observers . length )
64
+ } else currencySplit [ c ] = 0
65
+ }
66
+
67
+ // add currency to actors existing coins
68
+ let msg = [ ]
69
+ for ( let u of observers ) {
70
+ if ( u === null ) continue
71
+
72
+ msg = [ ]
73
+ let currency = LootSheet5eNPCHelper . convertCurrencyFromObject ( u . system . currency ) ,
74
+ newCurrency = foundry . utils . duplicate (
75
+ LootSheet5eNPCHelper . convertCurrencyFromObject ( u . system . currency ) ,
76
+ )
77
+
78
+ for ( let c in currency ) {
79
+ // add msg for chat description
80
+ if ( currencySplit [ c ] ) {
81
+ msg . push ( ` ${ currencySplit [ c ] } ${ c } coins` )
82
+ }
83
+ // Add currency to permitted actor
84
+ newCurrency [ c ] = parseInt ( currency [ c ] || 0 ) + ( currencySplit [ c ] ?? 0 )
85
+ }
86
+ u . update ( {
87
+ 'system.currency' : newCurrency ,
88
+ } )
89
+
90
+ // Create chat message for coins received
91
+ if ( msg . length != 0 ) {
92
+ let message = `${ u . name } receives: `
93
+ message += msg . join ( ',' )
94
+ ChatMessage . create ( {
95
+ user : game . user . _id ,
96
+ speaker : {
97
+ actor : containerActor ,
98
+ alias : containerActor . name ,
99
+ } ,
100
+ content : message ,
101
+ } )
102
+ }
103
+ }
104
+ // Remove currency from loot actor.
105
+ containerActor . update ( { 'system.currency' : currencyRemainder } )
106
+ }
29
107
}
30
108
31
109
class QuantityDialog extends Dialog {
@@ -925,6 +1003,9 @@ class LootSheet5eNPC extends dnd5e.applications.actor.ActorSheet5eNPC2 {
925
1003
*/
926
1004
_distributeCoins ( event ) {
927
1005
event . preventDefault ( )
1006
+ if ( ! game . settings . get ( 'lootsheet-simple' , 'lootCurrency' ) ) {
1007
+ return
1008
+ }
928
1009
929
1010
let targetGm = null
930
1011
game . users . forEach ( ( u ) => {
@@ -942,11 +1023,14 @@ class LootSheet5eNPC extends dnd5e.applications.actor.ActorSheet5eNPC2 {
942
1023
if ( this . token === null ) {
943
1024
return ui . notifications . error ( `You must loot items from a token.` )
944
1025
}
1026
+ if ( ! game . user . character ) {
1027
+ return ui . notifications . error ( `No active character for user.` )
1028
+ }
945
1029
946
1030
if ( game . user . isGM ) {
947
1031
//don't use socket
948
1032
let container = canvas . tokens . get ( this . token . id )
949
- this . _hackydistributeCoins ( container . actor )
1033
+ LootSheet5eNPCHelper . distributeCoins ( container . actor )
950
1034
return
951
1035
}
952
1036
@@ -960,99 +1044,6 @@ class LootSheet5eNPC extends dnd5e.applications.actor.ActorSheet5eNPC2 {
960
1044
game . socket . emit ( LootSheet5eNPC . SOCKET , packet )
961
1045
}
962
1046
963
- _hackydistributeCoins ( containerActor ) {
964
- //This is identical as the distributeCoins function defined in the init hook which for some reason can't be called from the above _distributeCoins method of the lootsheet-simple class. I couldn't be bothered to figure out why a socket can't be called as the GM... so this is a hack but it works.
965
- let actorData = containerActor . system
966
- let observers = [ ]
967
- let players = game . users . players
968
-
969
- // Calculate observers
970
- for ( let player of players ) {
971
- let playerPermission = LootSheet5eNPCHelper . getLootPermissionForPlayer ( actorData , player )
972
- if ( player != 'default' && playerPermission >= 2 ) {
973
- let actor = game . actors . get ( player . system . character )
974
- if ( actor != null && ( player . system . role === 1 || player . system . role === 2 ) )
975
- observers . push ( actor )
976
- }
977
- }
978
-
979
- if ( observers . length === 0 ) return
980
-
981
- // Calculate split of currency
982
- let currencySplit = foundry . utils . duplicate (
983
- LootSheet5eNPCHelper . convertCurrencyFromObject ( containerActor . system . currency ) ,
984
- )
985
-
986
- // keep track of the remainder
987
- let currencyRemainder = { }
988
-
989
- for ( let c in currencySplit ) {
990
- if ( observers . length ) {
991
- // calculate remainder
992
- currencyRemainder [ c ] = currencySplit [ c ] % observers . length
993
-
994
- currencySplit [ c ] = Math . floor ( currencySplit [ c ] / observers . length )
995
- } else currencySplit [ c ] = 0
996
- }
997
-
998
- // add currency to actors existing coins
999
- let msg = [ ]
1000
- for ( let u of observers ) {
1001
- if ( u === null ) continue
1002
-
1003
- msg = [ ]
1004
- let currency = LootSheet5eNPCHelper . convertCurrencyFromObject ( u . system . currency ) ,
1005
- newCurrency = foundry . utils . duplicate (
1006
- LootSheet5eNPCHelper . convertCurrencyFromObject ( u . system . currency ) ,
1007
- )
1008
-
1009
- for ( let c in currency ) {
1010
- // add msg for chat description
1011
- if ( currencySplit [ c ] ) {
1012
- msg . push ( ` ${ currencySplit [ c ] } ${ c } coins` )
1013
- }
1014
- if ( currencySplit [ c ] != null ) {
1015
- // Add currency to permitted actor
1016
- newCurrency [ c ] = parseInt ( currency [ c ] || 0 ) + currencySplit [ c ]
1017
- u . update ( {
1018
- 'system.currency' : newCurrency ,
1019
- } )
1020
- }
1021
- }
1022
-
1023
- // Remove currency from loot actor.
1024
- let lootCurrency = LootSheet5eNPCHelper . convertCurrencyFromObject (
1025
- containerActor . system . currency ,
1026
- ) ,
1027
- zeroCurrency = { }
1028
-
1029
- for ( let c in lootCurrency ) {
1030
- zeroCurrency [ c ] = {
1031
- type : currencySplit [ c ] . type ,
1032
- label : currencySplit [ c ] . type ,
1033
- value : currencyRemainder [ c ] ,
1034
- }
1035
- containerActor . update ( {
1036
- 'system.currency' : zeroCurrency ,
1037
- } )
1038
- }
1039
-
1040
- // Create chat message for coins received
1041
- if ( msg . length != 0 ) {
1042
- let message = `${ u . name } receives: `
1043
- message += msg . join ( ',' )
1044
- ChatMessage . create ( {
1045
- user : game . user . _id ,
1046
- speaker : {
1047
- actor : containerActor ,
1048
- alias : containerActor . name ,
1049
- } ,
1050
- content : message ,
1051
- } )
1052
- }
1053
- }
1054
- }
1055
-
1056
1047
/* -------------------------------------------- */
1057
1048
1058
1049
/**
@@ -1682,98 +1673,6 @@ Hooks.once('init', () => {
1682
1673
}
1683
1674
}
1684
1675
1685
- function distributeCoins ( containerActor ) {
1686
- let actorData = containerActor . system
1687
- let observers = [ ]
1688
- let players = game . users . players
1689
-
1690
- // Calculate observers
1691
- for ( let player of players ) {
1692
- let playerPermission = LootSheet5eNPCHelper . getLootPermissionForPlayer ( actorData , player )
1693
- if ( player != 'default' && playerPermission >= 2 ) {
1694
- let actor = game . actors . get ( player . system . character )
1695
- if ( actor != null && ( player . system . role === 1 || player . system . role === 2 ) )
1696
- observers . push ( actor )
1697
- }
1698
- }
1699
-
1700
- if ( observers . length === 0 ) return
1701
-
1702
- // Calculate split of currency
1703
- let currencySplit = foundry . utils . duplicate (
1704
- LootSheet5eNPCHelper . convertCurrencyFromObject ( containerActor . system . currency ) ,
1705
- )
1706
-
1707
- // keep track of the remainder
1708
- let currencyRemainder = { }
1709
-
1710
- for ( let c in currencySplit ) {
1711
- if ( observers . length ) {
1712
- // calculate remainder
1713
- currencyRemainder [ c ] = currencySplit [ c ] % observers . length
1714
-
1715
- currencySplit [ c ] = Math . floor ( currencySplit [ c ] / observers . length )
1716
- } else currencySplit [ c ] = 0
1717
- }
1718
-
1719
- // add currency to actors existing coins
1720
- let msg = [ ]
1721
- for ( let u of observers ) {
1722
- if ( u === null ) continue
1723
-
1724
- msg = [ ]
1725
- let currency = LootSheet5eNPCHelper . convertCurrencyFromObject ( u . system . currency ) ,
1726
- newCurrency = foundry . utils . duplicate (
1727
- LootSheet5eNPCHelper . convertCurrencyFromObject ( u . system . currency ) ,
1728
- )
1729
-
1730
- for ( let c in currency ) {
1731
- // add msg for chat description
1732
- if ( currencySplit [ c ] ) {
1733
- msg . push ( ` ${ currencySplit [ c ] } ${ c } coins` )
1734
- }
1735
-
1736
- // Add currency to permitted actor
1737
- newCurrency [ c ] = parseInt ( currency [ c ] || 0 ) + currencySplit [ c ]
1738
-
1739
- u . update ( {
1740
- 'system.currency' : newCurrency ,
1741
- } )
1742
- }
1743
-
1744
- // Remove currency from loot actor.
1745
- let lootCurrency = LootSheet5eNPCHelper . convertCurrencyFromObject (
1746
- containerActor . system . currency ,
1747
- ) ,
1748
- zeroCurrency = { }
1749
-
1750
- for ( let c in lootCurrency ) {
1751
- zeroCurrency [ c ] = {
1752
- type : currencySplit [ c ] . type ,
1753
- label : currencySplit [ c ] . type ,
1754
- value : currencyRemainder [ c ] ,
1755
- }
1756
- containerActor . update ( {
1757
- 'system.currency' : zeroCurrency ,
1758
- } )
1759
- }
1760
-
1761
- // Create chat message for coins received
1762
- if ( msg . length != 0 ) {
1763
- let message = `${ u . name } receives: `
1764
- message += msg . join ( ',' )
1765
- ChatMessage . create ( {
1766
- user : game . user . _id ,
1767
- speaker : {
1768
- actor : containerActor ,
1769
- alias : containerActor . name ,
1770
- } ,
1771
- content : message ,
1772
- } )
1773
- }
1774
- }
1775
- }
1776
-
1777
1676
function lootCoins ( containerActor , looter ) {
1778
1677
let sheetCurrency = LootSheet5eNPCHelper . convertCurrencyFromObject (
1779
1678
containerActor . system . currency ,
@@ -1872,7 +1771,7 @@ Hooks.once('init', () => {
1872
1771
'Player attempted to distribute coins on a different scene.' ,
1873
1772
)
1874
1773
}
1875
- distributeCoins ( container . actor )
1774
+ LootSheet5eNPCHelper . distributeCoins ( container . actor )
1876
1775
}
1877
1776
1878
1777
if ( data . type === 'lootCoins' ) {
0 commit comments