diff options
Diffstat (limited to 'Prim_manager.cs')
-rw-r--r-- | Prim_manager.cs | 237 |
1 files changed, 165 insertions, 72 deletions
diff --git a/Prim_manager.cs b/Prim_manager.cs index da1d626..1dc075b 100644 --- a/Prim_manager.cs +++ b/Prim_manager.cs | |||
@@ -35,53 +35,63 @@ using libsecondlife.AssetSystem; | |||
35 | using System.IO; | 35 | using System.IO; |
36 | using Axiom.MathLib; | 36 | using Axiom.MathLib; |
37 | 37 | ||
38 | namespace Second_server | 38 | namespace OpenSim |
39 | { | 39 | { |
40 | /// <summary> | 40 | /// <summary> |
41 | /// Description of Prim_manager. | 41 | /// Description of Prim_manager. |
42 | /// </summary> | 42 | /// </summary> |
43 | public class Prim_manager | 43 | public class PrimManager |
44 | { | 44 | { |
45 | private Server server; | 45 | private Server server; |
46 | public Agent_Manager agent_man; | 46 | public AgentManager Agent_Manager; |
47 | 47 | ||
48 | private uint prim_count; | 48 | private uint prim_count; |
49 | 49 | ||
50 | public libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock object_template; | 50 | public libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock PrimTemplate; |
51 | public Dictionary<libsecondlife.LLUUID,prim_info> Prim_list; | 51 | public Dictionary<libsecondlife.LLUUID,PrimInfo> PrimList; |
52 | public Prim_manager(Server serve) | 52 | |
53 | /// <summary> | ||
54 | /// | ||
55 | /// </summary> | ||
56 | /// <param name="serve"></param> | ||
57 | public PrimManager(Server serve) | ||
53 | { | 58 | { |
54 | server=serve; | 59 | server=serve; |
55 | Prim_list=new Dictionary<libsecondlife.LLUUID,prim_info> (); | 60 | PrimList=new Dictionary<libsecondlife.LLUUID,PrimInfo> (); |
56 | this.setuptemplates("objectupate164.dat"); | 61 | this.SetupTemplates("objectupate164.dat"); |
62 | |||
57 | } | 63 | } |
58 | 64 | ||
59 | 65 | /// <summary> | |
60 | //********************************************************************* | 66 | /// |
61 | public void create_prim(User_Agent_info User_info, libsecondlife.LLVector3 p1, ObjectAddPacket add_pack) | 67 | /// </summary> |
68 | /// <param name="User_info"></param> | ||
69 | /// <param name="p1"></param> | ||
70 | /// <param name="add_pack"></param> | ||
71 | public void CreatePrim(User_Agent_info User_info, libsecondlife.LLVector3 p1, ObjectAddPacket add_pack) | ||
62 | { | 72 | { |
63 | ObjectUpdatePacket objupdate=new ObjectUpdatePacket(); | 73 | ObjectUpdatePacket objupdate=new ObjectUpdatePacket(); |
64 | objupdate.RegionData.RegionHandle=1096213093147648; | 74 | objupdate.RegionData.RegionHandle=Globals.Instance.RegionHandle; |
65 | objupdate.RegionData.TimeDilation=64096; | 75 | objupdate.RegionData.TimeDilation=64096; |
66 | objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1]; | 76 | objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1]; |
67 | 77 | PrimData PData=new PrimData(); | |
68 | objupdate.ObjectData[0]=this.object_template; | 78 | objupdate.ObjectData[0]=this.PrimTemplate; |
69 | objupdate.ObjectData[0].OwnerID=User_info.AgentID; | 79 | PData.OwnerID=objupdate.ObjectData[0].OwnerID=User_info.AgentID; |
70 | objupdate.ObjectData[0].PCode=add_pack.ObjectData.PCode; | 80 | PData.PCode=objupdate.ObjectData[0].PCode=add_pack.ObjectData.PCode; |
71 | objupdate.ObjectData[0].PathBegin=add_pack.ObjectData.PathBegin; | 81 | PData.PathBegin=objupdate.ObjectData[0].PathBegin=add_pack.ObjectData.PathBegin; |
72 | objupdate.ObjectData[0].PathEnd=add_pack.ObjectData.PathEnd; | 82 | PData.PathEnd=objupdate.ObjectData[0].PathEnd=add_pack.ObjectData.PathEnd; |
73 | objupdate.ObjectData[0].PathScaleX=add_pack.ObjectData.PathScaleX; | 83 | PData.PathScaleX=objupdate.ObjectData[0].PathScaleX=add_pack.ObjectData.PathScaleX; |
74 | objupdate.ObjectData[0].PathScaleY=add_pack.ObjectData.PathScaleY; | 84 | PData.PathScaleY=objupdate.ObjectData[0].PathScaleY=add_pack.ObjectData.PathScaleY; |
75 | objupdate.ObjectData[0].PathShearX=add_pack.ObjectData.PathShearX; | 85 | PData.PathShearX=objupdate.ObjectData[0].PathShearX=add_pack.ObjectData.PathShearX; |
76 | objupdate.ObjectData[0].PathShearY=add_pack.ObjectData.PathShearY; | 86 | PData.PathShearY=objupdate.ObjectData[0].PathShearY=add_pack.ObjectData.PathShearY; |
77 | objupdate.ObjectData[0].PathSkew=add_pack.ObjectData.PathSkew; | 87 | PData.PathSkew=objupdate.ObjectData[0].PathSkew=add_pack.ObjectData.PathSkew; |
78 | objupdate.ObjectData[0].ProfileBegin=add_pack.ObjectData.ProfileBegin; | 88 | PData.ProfileBegin=objupdate.ObjectData[0].ProfileBegin=add_pack.ObjectData.ProfileBegin; |
79 | objupdate.ObjectData[0].ProfileEnd=add_pack.ObjectData.ProfileEnd; | 89 | PData.ProfileEnd=objupdate.ObjectData[0].ProfileEnd=add_pack.ObjectData.ProfileEnd; |
80 | objupdate.ObjectData[0].Scale=add_pack.ObjectData.Scale;//new LLVector3(1,1,1); | 90 | PData.Scale=objupdate.ObjectData[0].Scale=add_pack.ObjectData.Scale;//new LLVector3(1,1,1); |
81 | objupdate.ObjectData[0].PathCurve=add_pack.ObjectData.PathCurve; | 91 | PData.PathCurve=objupdate.ObjectData[0].PathCurve=add_pack.ObjectData.PathCurve; |
82 | objupdate.ObjectData[0].ProfileCurve=add_pack.ObjectData.ProfileCurve; | 92 | PData.ProfileCurve=objupdate.ObjectData[0].ProfileCurve=add_pack.ObjectData.ProfileCurve; |
83 | objupdate.ObjectData[0].ParentID=0; | 93 | PData.ParentID=objupdate.ObjectData[0].ParentID=0; |
84 | objupdate.ObjectData[0].ProfileHollow=add_pack.ObjectData.ProfileHollow; | 94 | PData.ProfileHollow=objupdate.ObjectData[0].ProfileHollow=add_pack.ObjectData.ProfileHollow; |
85 | //finish off copying rest of shape data | 95 | //finish off copying rest of shape data |
86 | 96 | ||
87 | objupdate.ObjectData[0].ID=(uint)(702000+prim_count); | 97 | objupdate.ObjectData[0].ID=(uint)(702000+prim_count); |
@@ -95,30 +105,40 @@ namespace Second_server | |||
95 | server.SendPacket(objupdate,true,User_info); | 105 | server.SendPacket(objupdate,true,User_info); |
96 | 106 | ||
97 | //should send to all users | 107 | //should send to all users |
98 | foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in agent_man.Agent_list) | 108 | foreach (KeyValuePair<libsecondlife.LLUUID,AvatarData> kp in Agent_Manager.AgentList) |
99 | { | 109 | { |
100 | if(kp.Value.Net_info.AgentID!=User_info.AgentID) | 110 | if(kp.Value.NetInfo.AgentID!=User_info.AgentID) |
101 | { | 111 | { |
102 | server.SendPacket(objupdate,true,kp.Value.Net_info); | 112 | server.SendPacket(objupdate,true,kp.Value.NetInfo); |
103 | } | 113 | } |
104 | } | 114 | } |
105 | //should store this infomation | 115 | //should store this infomation |
106 | prim_info n_prim=new prim_info(); | 116 | PrimInfo NewPrim=new PrimInfo(); |
107 | n_prim.full_ID=objupdate.ObjectData[0].FullID; | 117 | NewPrim.FullID=objupdate.ObjectData[0].FullID; |
108 | n_prim.local_ID=objupdate.ObjectData[0].ID; | 118 | NewPrim.LocalID=objupdate.ObjectData[0].ID; |
109 | n_prim.pos=p1; | 119 | NewPrim.Position=p1; |
120 | NewPrim.data=PData; | ||
110 | 121 | ||
111 | this.Prim_list.Add(n_prim.full_ID,n_prim); | 122 | this.PrimList.Add(NewPrim.FullID,NewPrim); |
112 | 123 | ||
113 | //store rest of data | 124 | //store rest of data |
114 | 125 | ||
115 | } | 126 | } |
116 | public void update_prim_position(User_Agent_info user,float x, float y, float z,uint l_id) | 127 | |
128 | /// <summary> | ||
129 | /// | ||
130 | /// </summary> | ||
131 | /// <param name="User"></param> | ||
132 | /// <param name="position"></param> | ||
133 | /// <param name="LocalID"></param> | ||
134 | /// <param name="setRotation"></param> | ||
135 | /// <param name="rotation"></param> | ||
136 | public void UpdatePrimPosition(User_Agent_info User,LLVector3 position,uint LocalID,bool setRotation, LLQuaternion rotation) | ||
117 | { | 137 | { |
118 | prim_info pri=null; | 138 | PrimInfo pri=null; |
119 | foreach (KeyValuePair<libsecondlife.LLUUID,prim_info> kp in this.Prim_list) | 139 | foreach (KeyValuePair<libsecondlife.LLUUID,PrimInfo> kp in this.PrimList) |
120 | { | 140 | { |
121 | if(kp.Value.local_ID==l_id) | 141 | if(kp.Value.LocalID==LocalID) |
122 | { | 142 | { |
123 | pri=kp.Value; | 143 | pri=kp.Value; |
124 | } | 144 | } |
@@ -127,18 +147,37 @@ namespace Second_server | |||
127 | { | 147 | { |
128 | return; | 148 | return; |
129 | } | 149 | } |
130 | uint ID=pri.local_ID; | 150 | uint ID=pri.LocalID; |
151 | libsecondlife.LLVector3 pos2=new LLVector3(position.X,position.Y,position.Z); | ||
152 | libsecondlife.LLQuaternion rotation2; | ||
153 | if(!setRotation) | ||
154 | { | ||
155 | pri.Position=pos2; | ||
156 | rotation2=new LLQuaternion(pri.Rotation.X,pri.Rotation.Y,pri.Rotation.Z,pri.Rotation.W); | ||
157 | } | ||
158 | else | ||
159 | { | ||
160 | rotation2=new LLQuaternion(rotation.X,rotation.Y,rotation.Z,rotation.W); | ||
161 | |||
162 | pos2=pri.Position; | ||
163 | pri.Rotation=rotation; | ||
164 | } | ||
165 | rotation2.W+=1; | ||
166 | rotation2.X+=1; | ||
167 | rotation2.Y+=1; | ||
168 | rotation2.Z+=1; | ||
169 | |||
131 | byte[] bytes=new byte[60]; | 170 | byte[] bytes=new byte[60]; |
132 | 171 | ||
133 | ImprovedTerseObjectUpdatePacket im=new ImprovedTerseObjectUpdatePacket(); | 172 | ImprovedTerseObjectUpdatePacket im=new ImprovedTerseObjectUpdatePacket(); |
134 | im.RegionData.RegionHandle=1096213093147648; | 173 | im.RegionData.RegionHandle=Globals.Instance.RegionHandle; |
135 | im.RegionData.TimeDilation=64096; | 174 | im.RegionData.TimeDilation=64096; |
136 | im.ObjectData=new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; | 175 | im.ObjectData=new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; |
137 | int i=0; | 176 | int i=0; |
138 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat=new ImprovedTerseObjectUpdatePacket.ObjectDataBlock(); | 177 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat=new ImprovedTerseObjectUpdatePacket.ObjectDataBlock(); |
139 | im.ObjectData[0]=dat; | 178 | im.ObjectData[0]=dat; |
140 | dat.TextureEntry=object_template.TextureEntry; | 179 | dat.TextureEntry=PrimTemplate.TextureEntry; |
141 | libsecondlife.LLVector3 pos2=new LLVector3(x,y,z); | 180 | //System.Console.WriteLine("new position is :"+position); |
142 | 181 | ||
143 | bytes[i++] = (byte)(ID % 256); | 182 | bytes[i++] = (byte)(ID % 256); |
144 | bytes[i++] = (byte)((ID >> 8) % 256); | 183 | bytes[i++] = (byte)((ID >> 8) % 256); |
@@ -151,7 +190,7 @@ namespace Second_server | |||
151 | // bytes[i++]=128; | 190 | // bytes[i++]=128; |
152 | // bytes[i++]=63; | 191 | // bytes[i++]=63; |
153 | byte[] pb=pos2.GetBytes(); | 192 | byte[] pb=pos2.GetBytes(); |
154 | pri.pos=pos2; | 193 | pri.Position=pos2; |
155 | Array.Copy(pb,0,bytes,i,pb.Length); | 194 | Array.Copy(pb,0,bytes,i,pb.Length); |
156 | i+=12; | 195 | i+=12; |
157 | ushort ac=32767; | 196 | ushort ac=32767; |
@@ -172,7 +211,27 @@ namespace Second_server | |||
172 | bytes[i++] = (byte)(ac % 256); | 211 | bytes[i++] = (byte)(ac % 256); |
173 | bytes[i++] = (byte)((ac >> 8) % 256); | 212 | bytes[i++] = (byte)((ac >> 8) % 256); |
174 | 213 | ||
214 | //if(setRotation) | ||
215 | //{ | ||
216 | |||
217 | ushort rw, rx,ry,rz; | ||
218 | rw=(ushort)(32768*rotation2.W); | ||
219 | rx=(ushort)(32768*rotation2.X); | ||
220 | ry=(ushort)(32768*rotation2.Y); | ||
221 | rz=(ushort)(32768*rotation2.Z); | ||
222 | |||
175 | //rot | 223 | //rot |
224 | bytes[i++] = (byte)(rx % 256); | ||
225 | bytes[i++] = (byte)((rx >> 8) % 256); | ||
226 | bytes[i++] = (byte)(ry % 256); | ||
227 | bytes[i++] = (byte)((ry >> 8) % 256); | ||
228 | bytes[i++] = (byte)(rz % 256); | ||
229 | bytes[i++] = (byte)((rz >> 8) % 256); | ||
230 | bytes[i++] = (byte)(rw % 256); | ||
231 | bytes[i++] = (byte)((rw >> 8) % 256); | ||
232 | //} | ||
233 | /*else | ||
234 | { | ||
176 | bytes[i++] = (byte)(ac % 256); | 235 | bytes[i++] = (byte)(ac % 256); |
177 | bytes[i++] = (byte)((ac >> 8) % 256); | 236 | bytes[i++] = (byte)((ac >> 8) % 256); |
178 | bytes[i++] = (byte)(ac % 256); | 237 | bytes[i++] = (byte)(ac % 256); |
@@ -181,7 +240,7 @@ namespace Second_server | |||
181 | bytes[i++] = (byte)((ac >> 8) % 256); | 240 | bytes[i++] = (byte)((ac >> 8) % 256); |
182 | bytes[i++] = (byte)(ac % 256); | 241 | bytes[i++] = (byte)(ac % 256); |
183 | bytes[i++] = (byte)((ac >> 8) % 256); | 242 | bytes[i++] = (byte)((ac >> 8) % 256); |
184 | 243 | }*/ | |
185 | //rotation vel | 244 | //rotation vel |
186 | bytes[i++] = (byte)(ac % 256); | 245 | bytes[i++] = (byte)(ac % 256); |
187 | bytes[i++] = (byte)((ac >> 8) % 256); | 246 | bytes[i++] = (byte)((ac >> 8) % 256); |
@@ -193,23 +252,32 @@ namespace Second_server | |||
193 | dat.Data=bytes; | 252 | dat.Data=bytes; |
194 | //server.SendPacket(im,true,user); | 253 | //server.SendPacket(im,true,user); |
195 | //should send to all users. | 254 | //should send to all users. |
196 | foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in agent_man.Agent_list) | 255 | foreach (KeyValuePair<libsecondlife.LLUUID,AvatarData> kp in Agent_Manager.AgentList) |
197 | { | 256 | { |
198 | if(kp.Value.Net_info.AgentID!=user.AgentID) | 257 | if(kp.Value.NetInfo.AgentID!=User.AgentID) |
199 | { | 258 | { |
200 | server.SendPacket(im,true,kp.Value.Net_info); | 259 | server.SendPacket(im,true,kp.Value.NetInfo); |
201 | } | 260 | } |
202 | } | 261 | } |
203 | } | 262 | } |
204 | public void send_existing_prims(User_Agent_info user) | 263 | |
264 | /// <summary> | ||
265 | /// | ||
266 | /// </summary> | ||
267 | /// <param name="user"></param> | ||
268 | public void SendExistingPrims(User_Agent_info user) | ||
205 | { | 269 | { |
206 | //send data for already created prims to a new joining user | 270 | //send data for already created prims to a new joining user |
207 | } | 271 | } |
208 | //************************************************************** | 272 | |
209 | public void setuptemplates(string name) | 273 | /// <summary> |
274 | /// | ||
275 | /// </summary> | ||
276 | /// <param name="name"></param> | ||
277 | public void SetupTemplates(string name) | ||
210 | { | 278 | { |
211 | ObjectUpdatePacket objupdate=new ObjectUpdatePacket(); | 279 | ObjectUpdatePacket objupdate=new ObjectUpdatePacket(); |
212 | objupdate.RegionData.RegionHandle=1096213093147648; | 280 | objupdate.RegionData.RegionHandle=Globals.Instance.RegionHandle; |
213 | objupdate.RegionData.TimeDilation=64096; | 281 | objupdate.RegionData.TimeDilation=64096; |
214 | objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1]; | 282 | objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1]; |
215 | 283 | ||
@@ -224,7 +292,7 @@ namespace Second_server | |||
224 | 292 | ||
225 | libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock objdata=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1,ref i); | 293 | libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock objdata=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1,ref i); |
226 | objupdate.ObjectData[0]=objdata; | 294 | objupdate.ObjectData[0]=objdata; |
227 | this.object_template=objdata; | 295 | this.PrimTemplate=objdata; |
228 | objdata.UpdateFlags=objdata.UpdateFlags+12-16+32+256; | 296 | objdata.UpdateFlags=objdata.UpdateFlags+12-16+32+256; |
229 | objdata.OwnerID=new LLUUID("00000000-0000-0000-0000-000000000000"); | 297 | objdata.OwnerID=new LLUUID("00000000-0000-0000-0000-000000000000"); |
230 | //test adding a new texture to object , to test image downloading | 298 | //test adding a new texture to object , to test image downloading |
@@ -235,8 +303,13 @@ namespace Second_server | |||
235 | 303 | ||
236 | objdata.TextureEntry=ntex.ToBytes(); | 304 | objdata.TextureEntry=ntex.ToBytes(); |
237 | } | 305 | } |
238 | //******************************************************************** | 306 | |
239 | public void Read_Prim_database(string name,User_Agent_info user) | 307 | /// <summary> |
308 | /// | ||
309 | /// </summary> | ||
310 | /// <param name="name"></param> | ||
311 | /// <param name="user"></param> | ||
312 | public void ReadPrimDatabase(string name,User_Agent_info user) | ||
240 | { | 313 | { |
241 | StreamReader SR; | 314 | StreamReader SR; |
242 | string line; | 315 | string line; |
@@ -253,7 +326,7 @@ namespace Second_server | |||
253 | int num=Convert.ToInt32(comp[2]); | 326 | int num=Convert.ToInt32(comp[2]); |
254 | int start=Convert.ToInt32(comp[1]); | 327 | int start=Convert.ToInt32(comp[1]); |
255 | ObjectUpdatePacket objupdate=new ObjectUpdatePacket(); | 328 | ObjectUpdatePacket objupdate=new ObjectUpdatePacket(); |
256 | objupdate.RegionData.RegionHandle=1096213093147648; | 329 | objupdate.RegionData.RegionHandle=Globals.Instance.RegionHandle; |
257 | objupdate.RegionData.TimeDilation=64096; | 330 | objupdate.RegionData.TimeDilation=64096; |
258 | objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[num]; | 331 | objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[num]; |
259 | 332 | ||
@@ -285,24 +358,44 @@ namespace Second_server | |||
285 | } | 358 | } |
286 | } | 359 | } |
287 | 360 | ||
288 | public class prim_info | 361 | public class PrimInfo |
289 | { | 362 | { |
290 | public LLVector3 pos; | 363 | public LLVector3 Position; |
291 | public LLVector3 vel; | 364 | public LLVector3 Velocity; |
292 | public uint local_ID; | 365 | public LLQuaternion Rotation=LLQuaternion.Identity; |
293 | public LLUUID full_ID; | 366 | public uint LocalID; |
294 | public prim_data data; | 367 | public LLUUID FullID; |
368 | public PrimData data; | ||
295 | 369 | ||
296 | public prim_info() | 370 | public PrimInfo() |
297 | { | 371 | { |
298 | pos=new LLVector3(0,0,0); | 372 | Position=new LLVector3(0,0,0); |
299 | vel=new LLVector3(0,0,0); | 373 | Velocity=new LLVector3(0,0,0); |
300 | data=new prim_data(); | 374 | //data=new PrimData(); |
301 | } | 375 | } |
302 | } | 376 | } |
303 | public class prim_data | 377 | public class PrimData |
304 | { | 378 | { |
305 | public prim_data() | 379 | public LLUUID OwnerID; |
380 | public byte PCode; | ||
381 | public byte PathBegin; | ||
382 | public byte PathEnd; | ||
383 | public byte PathScaleX; | ||
384 | public byte PathScaleY; | ||
385 | public byte PathShearX; | ||
386 | public byte PathShearY; | ||
387 | public sbyte PathSkew; | ||
388 | public byte ProfileBegin; | ||
389 | public byte ProfileEnd; | ||
390 | public LLVector3 Scale; | ||
391 | public byte PathCurve; | ||
392 | public byte ProfileCurve; | ||
393 | public uint ParentID=0; | ||
394 | public byte ProfileHollow; | ||
395 | |||
396 | public bool DataBaseStorage=false; | ||
397 | |||
398 | public PrimData() | ||
306 | { | 399 | { |
307 | 400 | ||
308 | } | 401 | } |