mNJoz0b1LKM#D%^w?b|e0+2N;H&k4Dy|cbA($6=h!l*;8J|BvZJgMY
zo1dqWiiL%?{y9I5RP)4hK~0~nTL;;nKIxw5c{|JRQjvucSgbE6CC+3e+b0$o*e?F&hq$yRUl5B3#+lzEvi!>&Ulx40^
zD45m`^cNL$a>!FEe=G(yw%4ohmvG29U^gg@fLb--oZAASIv)ZI(T+j@g`JuJLjsWi
zq~&sqWVzY5Qkk!|q0eFQ;dB)00iK&hQK7z#@6A8l7=*lB1^|RdpxHlv;+eB*ZyfjV
zgGWvtob}G+?;p7TlZjb+mjQ*hzx&Lt3l?|T(fi_Mb$497X5;9Ozw5i>kxi3t@Adud
zkNtK;bjcOtyO+Oo@YhGoTpD|H#Da@&n@~DD_T{o?uil`XlJ$pg)K`W+|JP^sd=bid
zYTeOAtLkn(>a&s0jvn;nuKw@dT9iL&*de>Nym-=tXG~xC>^c2^c<$sk<_0Q37aRjH
z3YL+#FmsjMP-uK(Zhli!D4Z7#hYNE3+#%BO$x3yFZWQV#*Qm`(fEq>v-)F;6Z{zid(e9{F%*f73S-a7u=Xpge<8n4RxU7zQ6oDi!y_mI+&U;nUfU~$P;C!HG3
z9{uVahd(~|m#gdYE}!-KrCok;>}OYP-Z9~$^ESUa`svRf%zymhE!{Tf27bN0+mLIv
zUp4yC=DBP2%DaA(DEY%}+Wb!jz0mLZ#~!)wmY>Z$@A;4Z^_x{2*Y?iqGj+?b(S4^a
z{F8p#LH}bKM$V==@85UZ-G2+zxVqsOhqZ@4+T|?ys)9a
z9cXqc{R~l&NF#JjgxtfY<`?EzSsYBCU?ZuwOGZ$w$Ro511kmmb*CRwFSK$P%<$`y`xh%CR620^<=)5!UGn146np*x4!
zQIB4{2vdB>o>>^iZT{ir7RZAjkHNHyb;j?{uyfI|Rw31VFL=Y4I8kJ-DY6nlN{6+<
z78@1UL;POjJu7b*YFkG?uNbqC?gm5T%iltf(_y_hgsr6O3*XFp;_h94|84N1jlJ*w
zuIGn)zgzOjm6!bM;N{U(<=0<5{JzN_+^}os>)YSB;l;xK#~gH35ABrwE3diWiMLnu
zx$?=bE9Q*eo7d~=j}H0dy}ie5yY;iZ`^a_Fhp*j!*YzhXY8H1K=2)|
z1WkU7@&&f#kn&Xk(4fHpsXgwKRa{>7D0RQX(zXyJ2svLREhIt8&P@A5B$0@8w2(rN
zD9y2Wg50H)2u@cUlTOwCsmI((-R|I2!i>7~(|P2hg{jbVQuo`Csz1B|;Z5yv!voVb
zWd%I+4&pI1JYb73Ye_%Hk`o?)FxMFXGK2>@*1~TtwGm6%yk(%R`H->(DAx9v(n@Y{
zbZ?@}z2|Z|Fbwn;WrmX8tstju_+#m$PUUp}-tdNl=TeY%g>29z#?9z$S|p*?sM_)f
zJcv5&*2y&aVMt18Wg1L<%VSS_{jJ7G8x-L1Z&Gy00@wu!KEC@U(g{+{FARl2&0j86V
z-gMdE=0TG2Af48+IjB%u<61lOC1+l7D)l8jISJbi4~@}-M5(j`D|n-nU;EF=9mgPn}!1GMvvH8g{T>XNq(
zvDu`+1`@JyB*`66u$o)b2ScgTV8&s~{AY~=0?j-%WMtUQehe7`Q+uQe9QIpCDsG?U1;Ptc&q03edYD6-@TqXrZJ@(NW~!Z4-a#xq&bjw3yUidsT&Yx=Nr~&%*5^mGz`Q^b{p=T$Uci{
zU5TP{<1IYCkgEpu%Hk;yo2<_CS%eU^4jB4_i*3AUE9^P+4b?$>~MD&m~XFXpW{PbDct;D^Yxrp&QF
zwj}ra8IVBHCAmN#5H~98DZEy`ka0$%vQ$QpCOIK{3Zj#~=QK)8yYXX;Lts^ed+flT
zi&*Er%*#1Rsa0pAc*!59(TFiUcHrLvrW2%jzvUb|@P{P$g41IM{y)Sa(R{y!f^GtD
zIMVfj_FSb_JxdRk#6ofN`b?u>ZWVWVDG0m`Pv0ca)ppPHFMl_Ue0^YgOr6vnDCv9U
z7}j{qbD3Af$zp5#shJ)nq<)p5b5)Dp^CY?P!P%Cbr
zzo?*+k&j3EV*x6!@RvX&0BNu#IQ8~mQCYB3SsrQTql3HKS>?n2K5~MpM;>f_fB?PE
z@_CG?bfnWB7RYHy4b%_6ws+&c#Y@cl6ncQ?f=Wg{?EwG)_=4
zxN~(8WPqiGBJzmDp}r+$v9_dcFE!}d%zuqw9^ZaTfRuR|;Nid_8Q*%Hl9aauzySKU
zeG+)+C_6WpD;P&e<&%((&RI4BFa~GDHE^M>Hj&-kJt&2&;LCt~bS?!Lp#RDgA`S}&
z?5j{szCzJk)K)U1B-NCt$%hKvCJ&?p6)(l)0SusWdtd+$5tWU!&u>{p6)9WQro~Bq
zWWuOFM3WV$-j_ekmZwA0H4vl#d7nQWBEUvXIyppQPRAUvtF-vEWF#6^oki`lW$Y#B
zV|R%O2@=pKV
zoJC%^@iH2l9FkI6kO<^t!IW?S6;&yP5Xq3`ifVLcpQQUJHuv|D
z*AAx_;%7Eeszt)ieDl*cXHnDd#fu0k8##%e#{i7HgnxplV5DSt3!inBi!sA2
zkC59a&239F^5C9uf;rA8v8IBAASc6%VFN@h5^I4-;Bw6As6}8^q)m-RVk(J~(rp*A
zpGD@V<&j2B0cArr^kXh-4D5KOA0SBP`7)-l;$5^|T2DkbocKzGv%smcTtp({j=O?Gn
z>74xno+;cXL^3t$Wcs_*7eCLZQ<4+X^qXreNafi-8I>G5@IEdU?GYl8%VZK+T2(h)
zBV%OD6H-$?h*KVq_wTi*tssr>;=J)Q&
z&gZ8xFFVd(1E8_b4-%yJ=YgMs-}F!c*-L*+R}q=lWin6tW~UXA3q9Slq1}snd|_u?
zoanCvzvhB0pZimg?1v9ftBCgskmDM*Qb$~;=kE6vtX@)#xSqCxoc<&ut_K|8GR27NY0~*fw8kMP
zA_u0w8A-I;c1#jM$LwWHMiT8Nh$NzJ*c;~%E7U{_+4L|>)7(2a{UR1Iuya&^lprxu
zHtYcm@E+M4_TV9+vN4lCOJdDN{Ee!)=hk8LSc{eXX+0NIu#DtS2cT`;R`RFyF``l<
zh_eM7b5Y1lgJ_II$?#8(Mkm4Ts+a9}k1G0T;$8Lj)NKTnzf8hJFEuD&>-8D%Ba(!<
zJ4X9f=3?gN7lu=2tlcq}pdcMGcE?;u00-9YnCm&B;*sw3;4GzLx=Zs{ZDg7s;43Mp
zdgMDje4zl{m-`AJDjzdJi<(F*ti>bYS(R?!s$x9mdN+c{e?q;|QGD+>c|lrQC5{!|4%h>CbsF4=q{tW}s$FcH
z{Nz;120upFf`T;293uc^TmSqRVLwMyJW@p&&PoyqRiBoOg`=vA0Z>zVSlSkXR3KNB
zNec;hs@k-Ih~!{q+EE9b3`gQFT4qGvqs1z%OgpcvAR#g`?Yv+B6_p$nPTx8<3B}R4
z-r^#m|1wtcf+GRQ{^v;mU{a9)L=Z_pDs2O;r8t^QkjpX6(;hA^?w`cQ?cwR02vUMv
z+9o|Fz)W3wNkoE>O2qi!wIcAU=Hlq%g>M~a&v}o@*h-Kl+3t6EG(de4LmTo%j)A>9oGNs$7U3s
z^%`B#Ri~f{sVQvMOi%ZsL<(qK@*_Hm$hw3%wQ*F;H7FH-
zxP%r8;^x$js33O|=hO}szz#R3b|er9kg!odGoq5yMxmB=pViHV_gOHF+o<@m<|~XymV^zPvWn6=_slNv
z#Uwhjkg(`6HwnyIP_7~W7l%%!OmK@HcLPB>BrbZ~
zhyW+tqQ@vF&VDtOoBh#-<6VVXRvW=1mM}87X|hinK~f}6
zlYKw|a=2--k0>HZ6856Y;~{pvnu{Z_l;QTGy-frulDHS`#RM4Q_M*L#hy+O(XDSpe
z(V|32*$emX&HX)ZrO7kgIOAy{NRPyE#sdkk!;Lc@!46JNGO9<~qDs3b)HZU%`~Kv(
zTXX<&+>la|;}%3Drx8CoT3KH_Jy4Wb-)`RjoS0E<#Qm#ga6*J!rp1g2YJNgZ4uO2;%mj{bUh|!Yq(wN7t)Vttqax
zDzT87DrKNzCL46D0$CZG3X&$HKvqUl^H1WE{cR<*Pz$bL|s`=|^^^x%S?
zE_p$!BnCZQfB-*S(9`5!$mC}Npq=fxhf}GTEWEZlhW{}&T
z^=&0coy7fFUs!-MZhzKS7?CUqQ<<7JEuyOxX1zgD1(?XCMi6L7LB)|<9vh@fek|SY>T%(gaz+1i1
z^t*n~0=C=|*(EPXjKn3f3lN}%TOzx}IyfoG#)NK!om`%*^^0Dk?4x!(DZG3KAcY5%
zk`!JHkrWx@3jy0s4yv}gXL2B##E&no27GUXssFw-sv_to6p7WeA)=o
zB{6pA0}3$3#qNAW5lNCUnTSNmZKrK6U%2-|HgNHi2`DW{jLgXdgaatyClgQzkqik%
z4r|M6TtwXaF1r$&D{{yr1xb)t(OvWrR57TG$P5>u19rjRS}
zs*;V-NNBd&UK?Mk#-^mY*jmDZvaYOz_!@G8+r6OtY6cs?xdo-WfuOBRTu{0Z0h8wz
zlx{hPm;=7-TEYQt&oQ4*a@kavJHSl^1&NS&fSV!#1aJqq>2pNIOE{-c*GlfKb9wx)
z-?^P;j&kP|fUKbUC7x3NU;qQ$IRzksNP>i{H`BqhUCZKlYpbW6DoEDhvfffR6{JXF
z)>~?9fH5xXEp-b-0wsiCc-*en>FH8--j@r(_%#wFO=1Yf4;7$`3&HrwA`&Ixu!)J7
z9RH1xN=Gi5R$lr&JXxV?GTBTHCqJ4I+dS|{+i)|VOgw*uXncS+fx;Kc&Qo+5-4%^H5D>I9=H3N
zN*<9o33X}f)fVIIraNRiawnT~a%E6?aY2$K)}`g~0BX3pw7e7|Arkh8>SxS%y*hzL
zHs9d(h?t}x4HEZ=7!<$&w@1VT5S1?>U|SyvtL{roKD?Gin7Du~kQF3AV!#%F0Tgfn
zTOfi+LKJ^NTp!W&q!P6z1K!kv6ZbGaMwmX=UU&F66Qo9$w;cAz1z1{;xfh6pN!VYi
zw{MR!`ed$)OBx8YmSP=;C{da8*J8
literal 0
HcmV?d00001
diff --git a/LWGlass/src/client/Loader.cs b/LWGlass/src/client/Loader.cs
new file mode 100644
index 0000000..75a5ff3
--- /dev/null
+++ b/LWGlass/src/client/Loader.cs
@@ -0,0 +1,16 @@
+using LogicAPI.Client;
+using LogicLog;
+
+namespace LWGlass
+{
+ public class LWGClient : ClientMod
+ {
+
+ static LWGClient() {}
+
+ protected override void Initialize()
+ {
+ Logger.Info("LWGClient - Loaded Client");
+ }
+ }
+}
\ No newline at end of file
diff --git a/LWGlass/src/client/Main.cs b/LWGlass/src/client/Main.cs
new file mode 100644
index 0000000..c074ed8
--- /dev/null
+++ b/LWGlass/src/client/Main.cs
@@ -0,0 +1,147 @@
+using JimmysUnityUtilities;
+using LogicAPI.Data;
+using LogicWorld.Building.Overhaul;
+using LogicWorld.ClientCode;
+using LogicWorld.ClientCode.Resizing;
+using LogicWorld.Interfaces;
+using LogicWorld.Interfaces.Building;
+using LogicWorld.Rendering.Chunks;
+using LogicWorld.Rendering.Components;
+using LogicWorld.Rendering.Dynamics;
+using LogicWorld.SharedCode.Components;
+using Unified.UniversalBlur.Runtime;
+using UnityEngine;
+
+namespace LWGlass.Client
+{
+ public class Glass :
+ ComponentClientCode,
+ IColorableClientCode,
+ IResizableX,
+ IResizableZ
+ {
+ private int previousSizeX;
+ private int previousSizeZ;
+
+ public Color24 Color
+ {
+ get => Data.Color;
+ set => Data.Color = value;
+ }
+ public string ColorsFileKey => "Boards";
+ public float MinColorValue => 0;
+
+ public int SizeX
+ {
+ get => Data.SizeX;
+ set => Data.SizeX = value;
+ }
+ public int MinX => 1;
+ public int MaxX => 80;
+ public float GridIntervalX => 1f;
+
+ public int SizeZ
+ {
+ get => Data.SizeZ;
+ set => Data.SizeZ = value;
+ }
+ public int MinZ => 1;
+ public int MaxZ => 80;
+ public float GridIntervalZ => 1f;
+
+ protected override void OnComponentImaged()
+ {
+ Data.Color = new Color24(255, 255, 255);
+ GameObject obj = Decorations[0].DecorationObject;
+ obj.GetComponent().sharedMaterial = LogicWorld.References.MaterialsCache.StandardUnlitColorTransparent(Color, 0.7f);
+ }
+
+ protected override void DataUpdate()
+ {
+ GameObject obj = Decorations[0].DecorationObject;
+ obj.GetComponent().sharedMaterial = LogicWorld.References.MaterialsCache.StandardUnlitColorTransparent(Color, 0.2f);
+ if (SizeX == previousSizeX && SizeZ == previousSizeZ)
+ return;
+ previousSizeX = SizeX;
+ previousSizeZ = SizeZ;
+ obj.transform.localScale = new Vector3(SizeX, .5f, SizeZ) * 0.3f;
+ }
+ protected override ChildPlacementInfo GenerateChildPlacementInfo()
+ {
+ ChildPlacementInfo childPlacementInfo = new ChildPlacementInfo();
+ childPlacementInfo.Points = new FixedPlacingPoint[SizeZ * SizeX * 2];
+
+ int i = 0;
+ for (int iX = 0; iX < SizeX; iX++)
+ {
+ for (int iZ = 0; iZ < SizeZ; iZ++)
+ {
+ childPlacementInfo.Points[i++] = new FixedPlacingPoint()
+ {
+ Position = new Vector3(iX, .5f, iZ),
+ UpDirection = new Vector3(0, 1, 0)
+ };
+ childPlacementInfo.Points[i++] = new FixedPlacingPoint()
+ {
+ Position = new Vector3(iX, 0, iZ),
+ UpDirection = new Vector3(0, -1, 0)
+ };
+ }
+ }
+ //for (int SX1 = 0; SX1 < SizeX; SX1++)
+ //{
+ // childPlacementInfo.Points[i++] = new FixedPlacingPoint()
+ // {
+ // Position = new Vector3(SX1, 0, -.3f ),
+ // UpDirection = new Vector3(0, 0, -1)
+ // };
+ // childPlacementInfo.Points[i++] = new FixedPlacingPoint()
+ // {
+ // Position = new Vector3(SX1, 0, SizeZ+.3f ),
+ // UpDirection = new Vector3(0, 0, 1)
+ // };
+ //}
+ //for (int SX1 = 0; SX1 < SizeZ; SX1++)
+ //{
+ // childPlacementInfo.Points[i++] = new FixedPlacingPoint()
+ // {
+ // Position = new Vector3(-.3f, 0, SX1 ),
+ // UpDirection = new Vector3(-1, 0, 0)
+ // };
+ // childPlacementInfo.Points[i++] = new FixedPlacingPoint()
+ // {
+ // Position = new Vector3(SizeX+.3f, 0, SX1 ),
+ // UpDirection = new Vector3(1, 0, 0)
+ // };
+ //}
+ return childPlacementInfo;
+ }
+ protected override IDecoration[] GenerateDecorations(Transform parentToCreateDecorationsUnder)
+ {
+ var myGameObject = new GameObject("glass");
+ myGameObject.transform.SetParent(parentToCreateDecorationsUnder);
+ var collider = myGameObject.AddComponent();
+ collider.center = new Vector3(.5f,.5f,.5f);
+ var meshFilter = myGameObject.AddComponent();
+ meshFilter.sharedMesh = LogicWorld.References.Meshes.OriginCube;
+ var meshRenderer = myGameObject.AddComponent();
+ meshRenderer.sharedMaterial = LogicWorld.References.MaterialsCache.StandardUnlitColorTransparent(Color, 0.2f);
+ return new IDecoration[]
+ {
+ new Decoration()
+ {
+ DecorationObject = myGameObject,
+ LocalPosition = new Vector3(-.15f, 0, -.15f),
+ AutoSetupColliders = true,
+ }
+ };
+ }
+
+ protected override void SetDataDefaultValues()
+ {
+ Data.SizeX = 1;
+ Data.SizeZ = 1;
+ Data.Color = new Color24(120, 120, 120);
+ }
+ }
+}
\ No newline at end of file
diff --git a/LWGlass/src/server/loader.cs b/LWGlass/src/server/loader.cs
new file mode 100644
index 0000000..bece219
--- /dev/null
+++ b/LWGlass/src/server/loader.cs
@@ -0,0 +1,8 @@
+using LogicAPI.Server;
+using LogicLog;
+
+public class Loader : ServerMod {
+ protected override void Initialize() {
+ Logger.Info("LWGServer - Loaded server");
+ }
+}
\ No newline at end of file