aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/OpenSim.RegionServer
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs286
-rw-r--r--OpenSim/OpenSim.RegionServer/world/Avatar.cs278
-rw-r--r--OpenSim/OpenSim.RegionServer/world/Primitive.cs555
3 files changed, 19 insertions, 1100 deletions
diff --git a/OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs b/OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs
index 67eab24..33132cf 100644
--- a/OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs
+++ b/OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs
@@ -11,327 +11,65 @@ namespace OpenSim.world
11 { 11 {
12 public override void update() 12 public override void update()
13 { 13 {
14 if (!this.childAvatar) 14
15 {
16 if (this._physActor == null)
17 {
18 //HACKHACK: Note to work out why this entity does not have a physics actor
19 // and prehaps create one.
20 return;
21 }
22 libsecondlife.LLVector3 pos2 = new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z);
23 if (this.updateflag)
24 {
25 //need to send movement info
26 //so create the improvedterseobjectupdate packet
27 //use CreateTerseBlock()
28 ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock();
29 ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
30 terse.RegionData.RegionHandle = m_regionHandle; // FIXME
31 terse.RegionData.TimeDilation = 64096;
32 terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
33 terse.ObjectData[0] = terseBlock;
34 List<Avatar> avList = this.m_world.RequestAvatarList();
35 foreach (Avatar client in avList)
36 {
37 client.SendPacketToViewer(terse);
38 }
39
40 updateflag = false;
41 //this._updateCount = 0;
42 }
43 else
44 {
45
46 if ((pos2 != this.positionLastFrame) || (this.movementflag == 16))
47 {
48 _updateCount++;
49 if (((!PhysicsEngineFlying) && (_updateCount > 3)) || (PhysicsEngineFlying) && (_updateCount > 0))
50 {
51 //It has been a while since last update was sent so lets send one.
52 ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock();
53 ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
54 terse.RegionData.RegionHandle = m_regionHandle; // FIXME
55 terse.RegionData.TimeDilation = 64096;
56 terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
57 terse.ObjectData[0] = terseBlock;
58 List<Avatar> avList = this.m_world.RequestAvatarList();
59 foreach (Avatar client in avList)
60 {
61 client.SendPacketToViewer(terse);
62 }
63 _updateCount = 0;
64 }
65
66 if (this.movementflag == 16)
67 {
68 movementflag = 0;
69 }
70 }
71
72 }
73 this.positionLastFrame = pos2;
74
75 if (!this.ControllingClient.m_sandboxMode)
76 {
77 if (pos2.X < 0)
78 {
79 ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z));
80 }
81
82 if (pos2.Y < 0)
83 {
84 ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z));
85 }
86
87 if (pos2.X > 255)
88 {
89 ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z));
90 }
91
92 if (pos2.Y > 255)
93 {
94 ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z));
95 }
96 }
97 }
98 15
99 } 16 }
100 17
101 public void SendUpdateToOtherClient(Avatar remoteAvatar) 18 public void SendUpdateToOtherClient(Avatar remoteAvatar)
102 { 19 {
103 ObjectUpdatePacket objupdate = CreateUpdatePacket(); 20
104 remoteAvatar.SendPacketToViewer(objupdate);
105 } 21 }
106 22
107 public ObjectUpdatePacket CreateUpdatePacket() 23 public ObjectUpdatePacket CreateUpdatePacket()
108 { 24 {
109 System.Text.Encoding _enc = System.Text.Encoding.ASCII; 25
110 //send a objectupdate packet with information about the clients avatar
111 ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
112 objupdate.RegionData.RegionHandle = m_regionHandle;
113 objupdate.RegionData.TimeDilation = 64096;
114 objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
115
116 objupdate.ObjectData[0] = AvatarTemplate;
117 //give this avatar object a local id and assign the user a name
118 objupdate.ObjectData[0].ID = this.localid;
119 objupdate.ObjectData[0].FullID = ControllingClient.AgentID;
120 objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + firstname + "\nLastName STRING RW SV " + lastname + " \0");
121
122 libsecondlife.LLVector3 pos2 = new LLVector3((float)this._physActor.Position.X, (float)this._physActor.Position.Y, (float)this._physActor.Position.Z);
123
124 byte[] pb = pos2.GetBytes();
125
126 Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
127 return objupdate;
128 } 26 }
129 27
130 public void SendInitialPosition() 28 public void SendInitialPosition()
131 { 29 {
132 System.Text.Encoding _enc = System.Text.Encoding.ASCII; 30
133 //send a objectupdate packet with information about the clients avatar
134
135 ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
136 objupdate.RegionData.RegionHandle = m_regionHandle;
137 objupdate.RegionData.TimeDilation = 64096;
138 objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
139 objupdate.ObjectData[0] = AvatarTemplate;
140 //give this avatar object a local id and assign the user a name
141
142 objupdate.ObjectData[0].ID = this.localid;
143 this.uuid = objupdate.ObjectData[0].FullID = ControllingClient.AgentID;
144 objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + firstname + "\nLastName STRING RW SV " + lastname + " \0");
145 libsecondlife.LLVector3 pos2 = new LLVector3((float)this.Pos.X, (float)this.Pos.Y, (float)this.Pos.Z);
146 byte[] pb = pos2.GetBytes();
147 Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
148 m_world._localNumber++;
149
150 List<Avatar> avList = this.m_world.RequestAvatarList();
151 foreach (Avatar client in avList)
152 {
153 client.SendPacketToViewer(objupdate);
154 if (client.ControllingClient.AgentID != this.ControllingClient.AgentID)
155 {
156 SendAppearanceToOtherAgent(client);
157 }
158 }
159 } 31 }
160 32
161 public void SendOurAppearance() 33 public void SendOurAppearance()
162 { 34 {
163 ControllingClient.SendAppearance(this.Wearables); 35
164 } 36 }
165 37
166 public void SendOurAppearance(ClientView OurClient) 38 public void SendOurAppearance(ClientView OurClient)
167 { 39 {
168 //event handler for wearables request 40
169 this.SendOurAppearance();
170 } 41 }
171 42
172 public void SendAppearanceToOtherAgent(Avatar avatarInfo) 43 public void SendAppearanceToOtherAgent(Avatar avatarInfo)
173 { 44 {
174 AvatarAppearancePacket avp = new AvatarAppearancePacket(); 45
175 avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
176 avp.ObjectData.TextureEntry = this.avatarAppearanceTexture.ToBytes();
177
178 AvatarAppearancePacket.VisualParamBlock avblock = null;
179 for (int i = 0; i < 218; i++)
180 {
181 avblock = new AvatarAppearancePacket.VisualParamBlock();
182 avblock.ParamValue = visualParams[i];
183 avp.VisualParam[i] = avblock;
184 }
185
186 avp.Sender.IsTrial = false;
187 avp.Sender.ID = ControllingClient.AgentID;
188 avatarInfo.SendPacketToViewer(avp);
189 } 46 }
190 47
191 public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam) 48 public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam)
192 { 49 {
193 LLObject.TextureEntry tex = new LLObject.TextureEntry(texture, 0, texture.Length); 50
194 this.avatarAppearanceTexture = tex;
195
196 for (int i = 0; i < visualParam.Length; i++)
197 {
198 this.visualParams[i] = visualParam[i].ParamValue;
199 }
200
201 List<Avatar> avList = this.m_world.RequestAvatarList();
202 foreach (Avatar client in avList)
203 {
204 if (client.ControllingClient.AgentID != this.ControllingClient.AgentID)
205 {
206 SendAppearanceToOtherAgent(client);
207 }
208 }
209 } 51 }
210 52
211 public void StopMovement() 53 public void StopMovement()
212 { 54 {
213 this._physActor.Velocity = new PhysicsVector(0, 0, 0); 55
214 ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock();
215 ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
216 terse.RegionData.RegionHandle = m_regionHandle; // FIXME
217 terse.RegionData.TimeDilation = 64096;
218 terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
219 terse.ObjectData[0] = terseBlock;
220 List<Avatar> avList = this.m_world.RequestAvatarList();
221 foreach (Avatar client in avList)
222 {
223 client.SendPacketToViewer(terse);
224 }
225 } 56 }
226 57
227 public ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateTerseBlock() 58 public ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateTerseBlock()
228 { 59 {
229 byte[] bytes = new byte[60]; 60
230 int i = 0;
231 ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
232
233 dat.TextureEntry = new byte[0];// AvatarTemplate.TextureEntry;
234 libsecondlife.LLVector3 pos2 = new LLVector3(0, 0, 0);
235 lock (m_world.LockPhysicsEngine)
236 {
237 pos2 = new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z);
238 }
239
240 uint ID = this.localid;
241
242 bytes[i++] = (byte)(ID % 256);
243 bytes[i++] = (byte)((ID >> 8) % 256);
244 bytes[i++] = (byte)((ID >> 16) % 256);
245 bytes[i++] = (byte)((ID >> 24) % 256);
246 bytes[i++] = 0;
247 bytes[i++] = 1;
248 i += 14;
249 bytes[i++] = 128;
250 bytes[i++] = 63;
251
252 byte[] pb = pos2.GetBytes();
253 Array.Copy(pb, 0, bytes, i, pb.Length);
254 i += 12;
255 ushort InternVelocityX;
256 ushort InternVelocityY;
257 ushort InternVelocityZ;
258 Axiom.MathLib.Vector3 internDirec = new Axiom.MathLib.Vector3(0, 0, 0);
259 lock (m_world.LockPhysicsEngine)
260 {
261 internDirec = new Axiom.MathLib.Vector3(this._physActor.Velocity.X, this._physActor.Velocity.Y, this._physActor.Velocity.Z);
262 }
263 internDirec = internDirec / 128.0f;
264 internDirec.x += 1;
265 internDirec.y += 1;
266 internDirec.z += 1;
267
268 InternVelocityX = (ushort)(32768 * internDirec.x);
269 InternVelocityY = (ushort)(32768 * internDirec.y);
270 InternVelocityZ = (ushort)(32768 * internDirec.z);
271
272 ushort ac = 32767;
273 bytes[i++] = (byte)(InternVelocityX % 256);
274 bytes[i++] = (byte)((InternVelocityX >> 8) % 256);
275 bytes[i++] = (byte)(InternVelocityY % 256);
276 bytes[i++] = (byte)((InternVelocityY >> 8) % 256);
277 bytes[i++] = (byte)(InternVelocityZ % 256);
278 bytes[i++] = (byte)((InternVelocityZ >> 8) % 256);
279
280 //accel
281 bytes[i++] = (byte)(ac % 256);
282 bytes[i++] = (byte)((ac >> 8) % 256);
283 bytes[i++] = (byte)(ac % 256);
284 bytes[i++] = (byte)((ac >> 8) % 256);
285 bytes[i++] = (byte)(ac % 256);
286 bytes[i++] = (byte)((ac >> 8) % 256);
287
288 //rot
289 bytes[i++] = (byte)(ac % 256);
290 bytes[i++] = (byte)((ac >> 8) % 256);
291 bytes[i++] = (byte)(ac % 256);
292 bytes[i++] = (byte)((ac >> 8) % 256);
293 bytes[i++] = (byte)(ac % 256);
294 bytes[i++] = (byte)((ac >> 8) % 256);
295 bytes[i++] = (byte)(ac % 256);
296 bytes[i++] = (byte)((ac >> 8) % 256);
297
298 //rotation vel
299 bytes[i++] = (byte)(ac % 256);
300 bytes[i++] = (byte)((ac >> 8) % 256);
301 bytes[i++] = (byte)(ac % 256);
302 bytes[i++] = (byte)((ac >> 8) % 256);
303 bytes[i++] = (byte)(ac % 256);
304 bytes[i++] = (byte)((ac >> 8) % 256);
305
306 dat.Data = bytes;
307 return (dat);
308 } 61 }
309 62
310 // Sends animation update 63 // Sends animation update
311 public void SendAnimPack(LLUUID animID, int seq) 64 public void SendAnimPack(LLUUID animID, int seq)
312 { 65 {
313 AvatarAnimationPacket ani = new AvatarAnimationPacket(); 66
314 ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[1];
315 ani.AnimationSourceList[0] = new AvatarAnimationPacket.AnimationSourceListBlock();
316 ani.AnimationSourceList[0].ObjectID = ControllingClient.AgentID;
317 ani.Sender = new AvatarAnimationPacket.SenderBlock();
318 ani.Sender.ID = ControllingClient.AgentID;
319 ani.AnimationList = new AvatarAnimationPacket.AnimationListBlock[1];
320 ani.AnimationList[0] = new AvatarAnimationPacket.AnimationListBlock();
321 ani.AnimationList[0].AnimID = this.current_anim = animID;
322 ani.AnimationList[0].AnimSequenceID = this.anim_seq = seq;
323
324 List<Avatar> avList = this.m_world.RequestAvatarList();
325 foreach (Avatar client in avList)
326 {
327 client.SendPacketToViewer(ani);
328 }
329 67
330 } 68 }
331 69
332 public void SendAnimPack() 70 public void SendAnimPack()
333 { 71 {
334 this.SendAnimPack(this.current_anim, this.anim_seq); 72
335 } 73 }
336 74
337 } 75 }
diff --git a/OpenSim/OpenSim.RegionServer/world/Avatar.cs b/OpenSim/OpenSim.RegionServer/world/Avatar.cs
index 9401036..a95b65d 100644
--- a/OpenSim/OpenSim.RegionServer/world/Avatar.cs
+++ b/OpenSim/OpenSim.RegionServer/world/Avatar.cs
@@ -109,109 +109,24 @@ namespace OpenSim.world
109 109
110 public override void addForces() 110 public override void addForces()
111 { 111 {
112 lock (this.forcesList) 112
113 {
114 if (this.forcesList.Count > 0)
115 {
116 for (int i = 0; i < this.forcesList.Count; i++)
117 {
118 NewForce force = this.forcesList[i];
119 PhysicsVector phyVector = new PhysicsVector(force.X, force.Y, force.Z);
120 lock (m_world.LockPhysicsEngine)
121 {
122 this._physActor.Velocity = phyVector;
123 }
124 this.updateflag = true;
125 this.velocity = new LLVector3(force.X, force.Y, force.Z); //shouldn't really be doing this
126 // but as we are setting the velocity (rather than using real forces) at the moment it is okay.
127 }
128 for (int i = 0; i < this.forcesList.Count; i++)
129 {
130 this.forcesList.RemoveAt(0);
131 }
132 }
133 }
134 } 113 }
135 114
136 public static void SetupTemplate(string name) 115 public static void SetupTemplate(string name)
137 { 116 {
138 FileInfo fInfo = new FileInfo(name); 117
139 long numBytes = fInfo.Length;
140 FileStream fStream = new FileStream(name, FileMode.Open, FileAccess.Read);
141 BinaryReader br = new BinaryReader(fStream);
142 byte[] data1 = br.ReadBytes((int)numBytes);
143 br.Close();
144 fStream.Close();
145
146 libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock objdata = new ObjectUpdatePacket.ObjectDataBlock(); // new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i);
147
148 SetDefaultPacketValues(objdata);
149 objdata.TextureEntry = data1;
150 objdata.UpdateFlags = 61 + (9 << 8) + (130 << 16) + (16 << 24);
151 objdata.PathCurve = 16;
152 objdata.ProfileCurve = 1;
153 objdata.PathScaleX = 100;
154 objdata.PathScaleY = 100;
155 objdata.ParentID = 0;
156 objdata.OwnerID = LLUUID.Zero;
157 objdata.Scale = new LLVector3(1, 1, 1);
158 objdata.PCode = 47;
159 System.Text.Encoding enc = System.Text.Encoding.ASCII;
160 libsecondlife.LLVector3 pos = new LLVector3(objdata.ObjectData, 16);
161 pos.X = 100f;
162 objdata.ID = 8880000;
163 objdata.NameValue = enc.GetBytes("FirstName STRING RW SV Test \nLastName STRING RW SV User \0");
164 libsecondlife.LLVector3 pos2 = new LLVector3(100f, 100f, 23f);
165 //objdata.FullID=user.AgentID;
166 byte[] pb = pos.GetBytes();
167 Array.Copy(pb, 0, objdata.ObjectData, 16, pb.Length);
168
169 Avatar.AvatarTemplate = objdata;
170 } 118 }
171 119
172 protected static void SetDefaultPacketValues(ObjectUpdatePacket.ObjectDataBlock objdata) 120 protected static void SetDefaultPacketValues(ObjectUpdatePacket.ObjectDataBlock objdata)
173 { 121 {
174 objdata.PSBlock = new byte[0]; 122
175 objdata.ExtraParams = new byte[1];
176 objdata.MediaURL = new byte[0];
177 objdata.NameValue = new byte[0];
178 objdata.Text = new byte[0];
179 objdata.TextColor = new byte[4];
180 objdata.JointAxisOrAnchor = new LLVector3(0, 0, 0);
181 objdata.JointPivot = new LLVector3(0, 0, 0);
182 objdata.Material = 4;
183 objdata.TextureAnim = new byte[0];
184 objdata.Sound = LLUUID.Zero;
185 LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
186 objdata.TextureEntry = ntex.ToBytes();
187 objdata.State = 0;
188 objdata.Data = new byte[0];
189
190 objdata.ObjectData = new byte[76];
191 objdata.ObjectData[15] = 128;
192 objdata.ObjectData[16] = 63;
193 objdata.ObjectData[56] = 128;
194 objdata.ObjectData[61] = 102;
195 objdata.ObjectData[62] = 40;
196 objdata.ObjectData[63] = 61;
197 objdata.ObjectData[64] = 189;
198 123
199 124
200 } 125 }
201 126
202 public void CompleteMovement() 127 public void CompleteMovement()
203 { 128 {
204 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.VERBOSE,"Avatar.cs:CompleteMovement() - Constructing AgentMovementComplete packet"); 129
205 AgentMovementCompletePacket mov = new AgentMovementCompletePacket();
206 mov.AgentData.SessionID = this.ControllingClient.SessionID;
207 mov.AgentData.AgentID = this.ControllingClient.AgentID;
208 mov.Data.RegionHandle = this.m_regionHandle;
209 // TODO - dynamicalise this stuff
210 mov.Data.Timestamp = 1172750370;
211 mov.Data.Position = this.ControllingClient.startpos;
212 mov.Data.LookAt = new LLVector3(0.99f, 0.042f, 0);
213
214 ControllingClient.OutPacket(mov);
215 } 130 }
216 131
217 public void HandleAgentUpdate(Packet pack) 132 public void HandleAgentUpdate(Packet pack)
@@ -221,194 +136,13 @@ namespace OpenSim.world
221 136
222 public void HandleUpdate(AgentUpdatePacket pack) 137 public void HandleUpdate(AgentUpdatePacket pack)
223 { 138 {
224 if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_FLY) != 0) 139
225 {
226 if (this._physActor.Flying == false)
227 {
228 this.current_anim = Animations.AnimsLLUUID["ANIM_AGENT_FLY"];
229 this.anim_seq = 1;
230 this.SendAnimPack();
231 }
232 this._physActor.Flying = true;
233
234 }
235 else
236 {
237 if (this._physActor.Flying == true)
238 {
239 this.current_anim = Animations.AnimsLLUUID["ANIM_AGENT_STAND"];
240 this.anim_seq = 1;
241 this.SendAnimPack();
242 }
243 this._physActor.Flying = false;
244 }
245 if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_AT_POS) != 0)
246 {
247 Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z);
248 if (((movementflag & 1) == 0) || (q != this.bodyRot))
249 {
250
251 if (((movementflag & 1) == 0) && (!this._physActor.Flying))
252 {
253 this.current_anim = Animations.AnimsLLUUID["ANIM_AGENT_WALK"];
254 this.anim_seq = 1;
255 this.SendAnimPack();
256 }
257
258
259 //we should add a new force to the list
260 // but for now we will deal with velocities
261 NewForce newVelocity = new NewForce();
262 Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(1, 0, 0);
263 Axiom.MathLib.Vector3 direc = q * v3;
264 direc.Normalize();
265
266 //work out velocity for sim physics system
267 direc = direc * ((0.03f) * 128f);
268 if (this._physActor.Flying)
269 direc *= 4;
270
271 newVelocity.X = direc.x;
272 newVelocity.Y = direc.y;
273 newVelocity.Z = direc.z;
274 this.forcesList.Add(newVelocity);
275 movementflag = 1;
276 this.bodyRot = q;
277 }
278 }
279 else if ((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_UP_POS) != 0) && (PhysicsEngineFlying))
280 {
281 if (((movementflag & 2) == 0) && this._physActor.Flying)
282 {
283 //we should add a new force to the list
284 // but for now we will deal with velocities
285 NewForce newVelocity = new NewForce();
286 Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(0, 0, 1);
287 Axiom.MathLib.Vector3 direc = v3;
288 direc.Normalize();
289
290 //work out velocity for sim physics system
291 direc = direc * ((0.03f) * 128f * 2);
292 newVelocity.X = direc.x;
293 newVelocity.Y = direc.y;
294 newVelocity.Z = direc.z;
295 this.forcesList.Add(newVelocity);
296 movementflag = 2;
297 }
298 }
299 else if ((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) && (PhysicsEngineFlying))
300 {
301 if (((movementflag & 4) == 0) && this._physActor.Flying)
302 {
303 //we should add a new force to the list
304 // but for now we will deal with velocities
305 NewForce newVelocity = new NewForce();
306 Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(0, 0, -1);
307 //Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z);
308 Axiom.MathLib.Vector3 direc = v3;
309 direc.Normalize();
310
311 //work out velocity for sim physics system
312 direc = direc * ((0.03f) * 128f * 2);
313 newVelocity.X = direc.x;
314 newVelocity.Y = direc.y;
315 newVelocity.Z = direc.z;
316 this.forcesList.Add(newVelocity);
317 movementflag = 4;
318 }
319 }
320 else if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_AT_NEG) != 0)
321 {
322 Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z);
323 if (((movementflag & 8) == 0) || (q != this.bodyRot))
324 {
325 //we should add a new force to the list
326 // but for now we will deal with velocities
327 NewForce newVelocity = new NewForce();
328 Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(-1, 0, 0);
329 Axiom.MathLib.Vector3 direc = q * v3;
330 direc.Normalize();
331
332 //work out velocity for sim physics system
333 direc = direc * ((0.03f) * 128f);
334 if (this._physActor.Flying)
335 direc *= 2;
336
337 newVelocity.X = direc.x;
338 newVelocity.Y = direc.y;
339 newVelocity.Z = direc.z;
340 this.forcesList.Add(newVelocity);
341 movementflag = 8;
342 this.bodyRot = q;
343 }
344 }
345 else
346 {
347 if (movementflag == 16)
348 {
349 movementflag = 0;
350 }
351 if ((movementflag) != 0)
352 {
353 NewForce newVelocity = new NewForce();
354 newVelocity.X = 0;
355 newVelocity.Y = 0;
356 newVelocity.Z = 0;
357 this.forcesList.Add(newVelocity);
358 movementflag = 0;
359 // We're standing still, so make it show!
360 if (this._physActor.Flying == false)
361 {
362 this.current_anim = Animations.AnimsLLUUID["ANIM_AGENT_STAND"];
363 this.anim_seq = 1;
364 this.SendAnimPack();
365 }
366 this.movementflag = 16;
367
368 }
369 }
370 } 140 }
371 141
372 //really really should be moved somewhere else (RegionInfo.cs ?) 142 //really really should be moved somewhere else (RegionInfo.cs ?)
373 public void SendRegionHandshake(World regionInfo) 143 public void SendRegionHandshake(World regionInfo)
374 { 144 {
375 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.VERBOSE,"Avatar.cs:SendRegionHandshake() - Creating empty RegionHandshake packet"); 145
376 System.Text.Encoding _enc = System.Text.Encoding.ASCII;
377 RegionHandshakePacket handshake = new RegionHandshakePacket();
378
379 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.VERBOSE,"Avatar.cs:SendRegionhandshake() - Filling in RegionHandshake details");
380 handshake.RegionInfo.BillableFactor = 0;
381 handshake.RegionInfo.IsEstateManager = false;
382 handshake.RegionInfo.TerrainHeightRange00 = 60;
383 handshake.RegionInfo.TerrainHeightRange01 = 60;
384 handshake.RegionInfo.TerrainHeightRange10 = 60;
385 handshake.RegionInfo.TerrainHeightRange11 = 60;
386 handshake.RegionInfo.TerrainStartHeight00 = 10;
387 handshake.RegionInfo.TerrainStartHeight01 = 10;
388 handshake.RegionInfo.TerrainStartHeight10 = 10;
389 handshake.RegionInfo.TerrainStartHeight11 = 10;
390 handshake.RegionInfo.SimAccess = 13;
391 handshake.RegionInfo.WaterHeight = m_regionWaterHeight;
392 uint regionFlags = 72458694;
393 if (this.m_regionTerraform)
394 {
395 regionFlags -= 64;
396 }
397 handshake.RegionInfo.RegionFlags = regionFlags;
398 handshake.RegionInfo.SimName = _enc.GetBytes(m_regionName + "\0");
399 handshake.RegionInfo.SimOwner = new LLUUID("00000000-0000-0000-0000-000000000000");
400 handshake.RegionInfo.TerrainBase0 = new LLUUID("b8d3965a-ad78-bf43-699b-bff8eca6c975");
401 handshake.RegionInfo.TerrainBase1 = new LLUUID("abb783e6-3e93-26c0-248a-247666855da3");
402 handshake.RegionInfo.TerrainBase2 = new LLUUID("179cdabd-398a-9b6b-1391-4dc333ba321f");
403 handshake.RegionInfo.TerrainBase3 = new LLUUID("beb169c7-11ea-fff2-efe5-0f24dc881df2");
404 handshake.RegionInfo.TerrainDetail0 = new LLUUID("00000000-0000-0000-0000-000000000000");
405 handshake.RegionInfo.TerrainDetail1 = new LLUUID("00000000-0000-0000-0000-000000000000");
406 handshake.RegionInfo.TerrainDetail2 = new LLUUID("00000000-0000-0000-0000-000000000000");
407 handshake.RegionInfo.TerrainDetail3 = new LLUUID("00000000-0000-0000-0000-000000000000");
408 handshake.RegionInfo.CacheID = new LLUUID("545ec0a5-5751-1026-8a0b-216e38a7ab37");
409
410 OpenSim.Framework.Console.MainConsole.Instance.WriteLine(OpenSim.Framework.Console.LogPriority.VERBOSE,"Avatar.cs:SendRegionHandshake() - Sending RegionHandshake packet");
411 this.ControllingClient.OutPacket(handshake);
412 } 146 }
413 147
414 public static void LoadAnims() 148 public static void LoadAnims()
diff --git a/OpenSim/OpenSim.RegionServer/world/Primitive.cs b/OpenSim/OpenSim.RegionServer/world/Primitive.cs
index e048a9e..433ea9e 100644
--- a/OpenSim/OpenSim.RegionServer/world/Primitive.cs
+++ b/OpenSim/OpenSim.RegionServer/world/Primitive.cs
@@ -12,559 +12,6 @@ namespace OpenSim.world
12{ 12{
13 public class Primitive : Entity 13 public class Primitive : Entity
14 { 14 {
15 protected float mesh_cutbegin; 15
16 protected float mesh_cutend;
17 protected PrimData primData;
18 protected bool newPrimFlag = false;
19 protected bool updateFlag = false;
20 protected bool dirtyFlag = false;
21 private ObjectUpdatePacket OurPacket;
22 private bool physicsEnabled = false;
23 private bool physicstest = false;
24 private LLVector3 positionLastFrame = new LLVector3(0, 0, 0);
25 private Dictionary<uint, ClientView> m_clientThreads;
26 private ulong m_regionHandle;
27 private const uint FULL_MASK_PERMISSIONS = 2147483647;
28
29 public bool PhysicsEnabled
30 {
31 get
32 {
33 return physicsEnabled;
34 }
35 set
36 {
37 physicsEnabled = value;
38 }
39 }
40 public bool UpdateFlag
41 {
42 get
43 {
44 return updateFlag;
45 }
46 set
47 {
48 updateFlag = value;
49 }
50 }
51 public LLVector3 Scale
52 {
53 set
54 {
55 LLVector3 offset = (value - primData.Scale);
56 offset.X /= 2;
57 offset.Y /= 2;
58 offset.Z /= 2;
59
60 this.primData.Position += offset;
61 this.primData.Scale = value;
62
63 this.dirtyFlag = true;
64 }
65 get
66 {
67 return this.primData.Scale;
68 }
69 }
70 public PhysicsActor PhysActor
71 {
72 set
73 {
74 this._physActor = value;
75 }
76 }
77
78 public Primitive(Dictionary<uint, ClientView> clientThreads, ulong regionHandle, World world)
79 {
80 mesh_cutbegin = 0.0f;
81 mesh_cutend = 1.0f;
82
83 m_clientThreads = clientThreads;
84 m_regionHandle = regionHandle;
85 m_world = world;
86 }
87
88 public override Mesh getMesh()
89 {
90 Mesh mesh = new Mesh();
91 Triangle tri = new Triangle(
92 new Axiom.MathLib.Vector3(0.0f, 1.0f, 1.0f),
93 new Axiom.MathLib.Vector3(1.0f, 0.0f, 1.0f),
94 new Axiom.MathLib.Vector3(1.0f, 1.0f, 0.0f));
95
96 mesh.AddTri(tri);
97 mesh += base.getMesh();
98
99 return mesh;
100 }
101
102 public byte[] GetByteArray()
103 {
104 return this.primData.ToBytes();
105 }
106
107 public void GetProperites(ClientView client)
108 {
109 ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
110 proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
111 proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
112 proper.ObjectData[0].ItemID = LLUUID.Zero; // this.uuid;
113 proper.ObjectData[0].CreationDate = (ulong) this.primData.CreationDate;
114 proper.ObjectData[0].CreatorID = this.primData.OwnerID;
115 proper.ObjectData[0].FolderID = LLUUID.Zero;
116 proper.ObjectData[0].FromTaskID = LLUUID.Zero;
117 proper.ObjectData[0].GroupID = LLUUID.Zero;
118 proper.ObjectData[0].InventorySerial = 0;
119 proper.ObjectData[0].LastOwnerID = LLUUID.Zero;
120 proper.ObjectData[0].ObjectID = this.uuid;
121 proper.ObjectData[0].OwnerID = primData.OwnerID;
122 proper.ObjectData[0].TouchName = new byte[0];
123 proper.ObjectData[0].TextureID = new byte[0];
124 proper.ObjectData[0].SitName = new byte[0];
125 proper.ObjectData[0].Name = new byte[0];
126 proper.ObjectData[0].Description = new byte[0];
127 proper.ObjectData[0].OwnerMask = this.primData.OwnerMask;
128 proper.ObjectData[0].NextOwnerMask = this.primData.NextOwnerMask;
129 proper.ObjectData[0].GroupMask = this.primData.GroupMask;
130 proper.ObjectData[0].EveryoneMask = this.primData.EveryoneMask;
131 proper.ObjectData[0].BaseMask = this.primData.BaseMask;
132
133 client.OutPacket(proper);
134 }
135
136 public void UpdatePosition(LLVector3 pos)
137 {
138 this.Pos = pos;
139 if (this._physActor != null) // && this.physicsEnabled)
140 {
141 try
142 {
143 lock (m_world.LockPhysicsEngine)
144 {
145 this._physActor.Position = new PhysicsVector(pos.X, pos.Y, pos.Z);
146 }
147 }
148 catch (Exception e)
149 {
150 Console.WriteLine(e.Message);
151 }
152 }
153 this.updateFlag = true;
154 }
155
156 public override void update()
157 {
158 LLVector3 pos2 = new LLVector3(0, 0, 0);
159 if (this._physActor != null && this.physicsEnabled)
160 {
161
162 PhysicsVector pPos = this._physActor.Position;
163 pos2 = new LLVector3(pPos.X, pPos.Y, pPos.Z);
164 }
165 if (this.newPrimFlag)
166 {
167 foreach (ClientView client in m_clientThreads.Values)
168 {
169 client.OutPacket(OurPacket);
170 }
171 this.newPrimFlag = false;
172 }
173 else if (this.updateFlag)
174 {
175 ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
176 terse.RegionData.RegionHandle = m_regionHandle; // FIXME
177 terse.RegionData.TimeDilation = 64096;
178 terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
179 terse.ObjectData[0] = this.CreateImprovedBlock();
180 foreach (ClientView client in m_clientThreads.Values)
181 {
182 client.OutPacket(terse);
183 }
184 this.updateFlag = false;
185 }
186 else if (this.dirtyFlag)
187 {
188 foreach (ClientView client in m_clientThreads.Values)
189 {
190 UpdateClient(client);
191 }
192 this.dirtyFlag = false;
193 }
194 else
195 {
196 if (this._physActor != null && this.physicsEnabled)
197 {
198 if (pos2 != this.positionLastFrame)
199 {
200 ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
201 terse.RegionData.RegionHandle = m_regionHandle; // FIXME
202 terse.RegionData.TimeDilation = 64096;
203 terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
204 terse.ObjectData[0] = this.CreateImprovedBlock();
205 foreach (ClientView client in m_clientThreads.Values)
206 {
207 client.OutPacket(terse);
208 }
209 }
210 this.positionLastFrame = pos2;
211 }
212 }
213
214 if (this.physicstest)
215 {
216 LLVector3 pos = this.Pos;
217 pos.Z += 0.0001f;
218 this.UpdatePosition(pos);
219 this.physicstest = false;
220 }
221 }
222
223 public void UpdateClient(ClientView RemoteClient)
224 {
225
226 LLVector3 lPos;
227 if (this._physActor != null && this.physicsEnabled)
228 {
229 PhysicsVector pPos = this._physActor.Position;
230 lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
231 }
232 else
233 {
234 lPos = this.Pos;
235 }
236 byte[] pb = lPos.GetBytes();
237 Array.Copy(pb, 0, OurPacket.ObjectData[0].ObjectData, 0, pb.Length);
238
239 // OurPacket should be update with the follwing in updateShape() rather than having to do it here
240 OurPacket.ObjectData[0].OwnerID = this.primData.OwnerID;
241 OurPacket.ObjectData[0].PCode = this.primData.PCode;
242 OurPacket.ObjectData[0].PathBegin = this.primData.PathBegin;
243 OurPacket.ObjectData[0].PathEnd = this.primData.PathEnd;
244 OurPacket.ObjectData[0].PathScaleX = this.primData.PathScaleX;
245 OurPacket.ObjectData[0].PathScaleY = this.primData.PathScaleY;
246 OurPacket.ObjectData[0].PathShearX = this.primData.PathShearX;
247 OurPacket.ObjectData[0].PathShearY = this.primData.PathShearY;
248 OurPacket.ObjectData[0].PathSkew = this.primData.PathSkew;
249 OurPacket.ObjectData[0].ProfileBegin = this.primData.ProfileBegin;
250 OurPacket.ObjectData[0].ProfileEnd = this.primData.ProfileEnd;
251 OurPacket.ObjectData[0].Scale = this.primData.Scale;
252 OurPacket.ObjectData[0].PathCurve = this.primData.PathCurve;
253 OurPacket.ObjectData[0].ProfileCurve = this.primData.ProfileCurve;
254 OurPacket.ObjectData[0].ParentID = this.primData.ParentID ;
255 OurPacket.ObjectData[0].ProfileHollow = this.primData.ProfileHollow;
256 //finish off copying rest of shape data
257 OurPacket.ObjectData[0].PathRadiusOffset = this.primData.PathRadiusOffset;
258 OurPacket.ObjectData[0].PathRevolutions = this.primData.PathRevolutions;
259 OurPacket.ObjectData[0].PathTaperX = this.primData.PathTaperX;
260 OurPacket.ObjectData[0].PathTaperY = this.primData.PathTaperY;
261 OurPacket.ObjectData[0].PathTwist = this.primData.PathTwist;
262 OurPacket.ObjectData[0].PathTwistBegin = this.primData.PathTwistBegin;
263
264 RemoteClient.OutPacket(OurPacket);
265 }
266
267 public void UpdateShape(ObjectShapePacket.ObjectDataBlock addPacket)
268 {
269 this.primData.PathBegin = addPacket.PathBegin;
270 this.primData.PathEnd = addPacket.PathEnd;
271 this.primData.PathScaleX = addPacket.PathScaleX;
272 this.primData.PathScaleY = addPacket.PathScaleY;
273 this.primData.PathShearX = addPacket.PathShearX;
274 this.primData.PathShearY = addPacket.PathShearY;
275 this.primData.PathSkew = addPacket.PathSkew;
276 this.primData.ProfileBegin = addPacket.ProfileBegin;
277 this.primData.ProfileEnd = addPacket.ProfileEnd;
278 this.primData.PathCurve = addPacket.PathCurve;
279 this.primData.ProfileCurve = addPacket.ProfileCurve;
280 this.primData.ProfileHollow = addPacket.ProfileHollow;
281 this.primData.PathRadiusOffset = addPacket.PathRadiusOffset;
282 this.primData.PathRevolutions = addPacket.PathRevolutions;
283 this.primData.PathTaperX = addPacket.PathTaperX;
284 this.primData.PathTaperY = addPacket.PathTaperY;
285 this.primData.PathTwist = addPacket.PathTwist;
286 this.primData.PathTwistBegin = addPacket.PathTwistBegin;
287 this.dirtyFlag = true;
288 }
289
290 public void UpdateTexture(byte[] tex)
291 {
292 this.OurPacket.ObjectData[0].TextureEntry = tex;
293 this.primData.Texture = tex;
294 this.dirtyFlag = true;
295 }
296
297 public void UpdateObjectFlags(ObjectFlagUpdatePacket pack)
298 {
299 if (this._physActor != null)
300 {
301 if (this._physActor.Kinematic == pack.AgentData.UsePhysics)
302 {
303 this._physActor.Kinematic = !pack.AgentData.UsePhysics; //if Usephysics = true, then Kinematic should = false
304 }
305 this.physicsEnabled = pack.AgentData.UsePhysics;
306 if (this._physActor.Kinematic == false)
307 {
308 LLVector3 pos = this.Pos;
309 this.UpdatePosition(pos);
310 pos.Z += 0.000001f;
311 this.UpdatePosition(pos);
312 this.physicstest = true;
313 }
314 else
315 {
316 PhysicsVector vec = this._physActor.Position;
317 LLVector3 pos = new LLVector3(vec.X, vec.Y, vec.Z);
318 this.Pos = pos;
319 this.updateFlag = true;
320 }
321 }
322 }
323
324 public void MakeParent(Primitive prim)
325 {
326 this.primData.ParentID = prim.localid;
327 this.Pos -= prim.Pos;
328 this.dirtyFlag = true;
329 }
330
331 public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID ownerID, uint localID)
332 {
333 ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
334 objupdate.RegionData.RegionHandle = m_regionHandle;
335 objupdate.RegionData.TimeDilation = 64096;
336
337 objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
338 PrimData PData = new PrimData();
339 this.primData = PData;
340 this.primData.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
341
342 objupdate.ObjectData[0] = new ObjectUpdatePacket.ObjectDataBlock();
343 objupdate.ObjectData[0].PSBlock = new byte[0];
344 objupdate.ObjectData[0].ExtraParams = new byte[1];
345 objupdate.ObjectData[0].MediaURL = new byte[0];
346 objupdate.ObjectData[0].NameValue = new byte[0];
347 objupdate.ObjectData[0].Text = new byte[0];
348 objupdate.ObjectData[0].TextColor = new byte[4];
349 objupdate.ObjectData[0].JointAxisOrAnchor = new LLVector3(0, 0, 0);
350 objupdate.ObjectData[0].JointPivot = new LLVector3(0, 0, 0);
351 objupdate.ObjectData[0].Material = 3;
352 objupdate.ObjectData[0].UpdateFlags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456;
353 objupdate.ObjectData[0].TextureAnim = new byte[0];
354 objupdate.ObjectData[0].Sound = LLUUID.Zero;
355 LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
356 this.primData.Texture = objupdate.ObjectData[0].TextureEntry = ntex.ToBytes();
357 objupdate.ObjectData[0].State = 0;
358 objupdate.ObjectData[0].Data = new byte[0];
359 PData.OwnerID = objupdate.ObjectData[0].OwnerID = ownerID;
360 PData.PCode = objupdate.ObjectData[0].PCode = addPacket.ObjectData.PCode;
361 PData.PathBegin = objupdate.ObjectData[0].PathBegin = addPacket.ObjectData.PathBegin;
362 PData.PathEnd = objupdate.ObjectData[0].PathEnd = addPacket.ObjectData.PathEnd;
363 PData.PathScaleX = objupdate.ObjectData[0].PathScaleX = addPacket.ObjectData.PathScaleX;
364 PData.PathScaleY = objupdate.ObjectData[0].PathScaleY = addPacket.ObjectData.PathScaleY;
365 PData.PathShearX = objupdate.ObjectData[0].PathShearX = addPacket.ObjectData.PathShearX;
366 PData.PathShearY = objupdate.ObjectData[0].PathShearY = addPacket.ObjectData.PathShearY;
367 PData.PathSkew = objupdate.ObjectData[0].PathSkew = addPacket.ObjectData.PathSkew;
368 PData.ProfileBegin = objupdate.ObjectData[0].ProfileBegin = addPacket.ObjectData.ProfileBegin;
369 PData.ProfileEnd = objupdate.ObjectData[0].ProfileEnd = addPacket.ObjectData.ProfileEnd;
370 PData.Scale = objupdate.ObjectData[0].Scale = addPacket.ObjectData.Scale;
371 PData.PathCurve = objupdate.ObjectData[0].PathCurve = addPacket.ObjectData.PathCurve;
372 PData.ProfileCurve = objupdate.ObjectData[0].ProfileCurve = addPacket.ObjectData.ProfileCurve;
373 PData.ParentID = objupdate.ObjectData[0].ParentID = 0;
374 PData.ProfileHollow = objupdate.ObjectData[0].ProfileHollow = addPacket.ObjectData.ProfileHollow;
375 PData.PathRadiusOffset = objupdate.ObjectData[0].PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
376 PData.PathRevolutions = objupdate.ObjectData[0].PathRevolutions = addPacket.ObjectData.PathRevolutions;
377 PData.PathTaperX = objupdate.ObjectData[0].PathTaperX = addPacket.ObjectData.PathTaperX;
378 PData.PathTaperY = objupdate.ObjectData[0].PathTaperY = addPacket.ObjectData.PathTaperY;
379 PData.PathTwist = objupdate.ObjectData[0].PathTwist = addPacket.ObjectData.PathTwist;
380 PData.PathTwistBegin = objupdate.ObjectData[0].PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
381 objupdate.ObjectData[0].ID = (uint)(localID);
382 objupdate.ObjectData[0].FullID = new LLUUID("edba7151-5857-acc5-b30b-f01efef" + (localID - 702000).ToString("00000"));
383 objupdate.ObjectData[0].ObjectData = new byte[60];
384 objupdate.ObjectData[0].ObjectData[46] = 128;
385 objupdate.ObjectData[0].ObjectData[47] = 63;
386 LLVector3 pos1 = addPacket.ObjectData.RayEnd;
387 //update position
388 byte[] pb = pos1.GetBytes();
389 Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 0, pb.Length);
390 this.newPrimFlag = true;
391 this.primData.FullID = this.uuid = objupdate.ObjectData[0].FullID;
392 this.localid = objupdate.ObjectData[0].ID;
393 this.primData.Position = this.Pos = pos1;
394 this.OurPacket = objupdate;
395 }
396
397 public void CreateFromStorage(PrimData store)
398 {
399 this.CreateFromStorage(store, store.Position, store.LocalID, false);
400 }
401
402 public void CreateFromStorage(PrimData store, LLVector3 posi, uint localID, bool newprim)
403 {
404 //need to clean this up as it shares a lot of code with CreateFromPacket()
405 ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
406 objupdate.RegionData.RegionHandle = m_regionHandle;
407 objupdate.RegionData.TimeDilation = 64096;
408 objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
409
410 this.primData = store;
411 objupdate.ObjectData[0] = new ObjectUpdatePacket.ObjectDataBlock();
412 objupdate.ObjectData[0].PSBlock = new byte[0];
413 objupdate.ObjectData[0].ExtraParams = new byte[1];
414 objupdate.ObjectData[0].MediaURL = new byte[0];
415 objupdate.ObjectData[0].NameValue = new byte[0];
416 objupdate.ObjectData[0].Text = new byte[0];
417 objupdate.ObjectData[0].TextColor = new byte[4];
418 objupdate.ObjectData[0].JointAxisOrAnchor = new LLVector3(0, 0, 0);
419 objupdate.ObjectData[0].JointPivot = new LLVector3(0, 0, 0);
420 objupdate.ObjectData[0].Material = 3;
421 objupdate.ObjectData[0].UpdateFlags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456;
422 objupdate.ObjectData[0].TextureAnim = new byte[0];
423 objupdate.ObjectData[0].Sound = LLUUID.Zero;
424
425 if (store.Texture == null)
426 {
427 LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
428 objupdate.ObjectData[0].TextureEntry = ntex.ToBytes();
429 }
430 else
431 {
432 objupdate.ObjectData[0].TextureEntry = store.Texture;
433 }
434
435 objupdate.ObjectData[0].State = 0;
436 objupdate.ObjectData[0].Data = new byte[0];
437 objupdate.ObjectData[0].OwnerID = this.primData.OwnerID;
438 objupdate.ObjectData[0].PCode = this.primData.PCode;
439 objupdate.ObjectData[0].PathBegin = this.primData.PathBegin;
440 objupdate.ObjectData[0].PathEnd = this.primData.PathEnd;
441 objupdate.ObjectData[0].PathScaleX = this.primData.PathScaleX;
442 objupdate.ObjectData[0].PathScaleY = this.primData.PathScaleY;
443 objupdate.ObjectData[0].PathShearX = this.primData.PathShearX;
444 objupdate.ObjectData[0].PathShearY = this.primData.PathShearY;
445 objupdate.ObjectData[0].PathSkew = this.primData.PathSkew;
446 objupdate.ObjectData[0].ProfileBegin = this.primData.ProfileBegin;
447 objupdate.ObjectData[0].ProfileEnd = this.primData.ProfileEnd;
448 objupdate.ObjectData[0].Scale = this.primData.Scale;
449 objupdate.ObjectData[0].PathCurve = this.primData.PathCurve;
450 objupdate.ObjectData[0].ProfileCurve = this.primData.ProfileCurve;
451 objupdate.ObjectData[0].ParentID = 0;
452 objupdate.ObjectData[0].ProfileHollow = this.primData.ProfileHollow;
453 //finish off copying rest of shape data
454 objupdate.ObjectData[0].PathRadiusOffset = this.primData.PathRadiusOffset;
455 objupdate.ObjectData[0].PathRevolutions = this.primData.PathRevolutions;
456 objupdate.ObjectData[0].PathTaperX = this.primData.PathTaperX;
457 objupdate.ObjectData[0].PathTaperY = this.primData.PathTaperY;
458 objupdate.ObjectData[0].PathTwist = this.primData.PathTwist;
459 objupdate.ObjectData[0].PathTwistBegin = this.primData.PathTwistBegin;
460
461 objupdate.ObjectData[0].ID = localID; // (uint)store.LocalID;
462 objupdate.ObjectData[0].FullID = store.FullID;
463
464 objupdate.ObjectData[0].ObjectData = new byte[60];
465 objupdate.ObjectData[0].ObjectData[46] = 128;
466 objupdate.ObjectData[0].ObjectData[47] = 63;
467 LLVector3 pos1 = posi; // store.Position;
468 //update position
469 byte[] pb = pos1.GetBytes();
470 Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 0, pb.Length);
471
472 this.uuid = objupdate.ObjectData[0].FullID;
473 this.localid = objupdate.ObjectData[0].ID;
474 this.Pos = pos1;
475 this.OurPacket = objupdate;
476 if (newprim)
477 {
478 this.newPrimFlag = true;
479 }
480 }
481
482 public ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedBlock()
483 {
484 uint ID = this.localid;
485 byte[] bytes = new byte[60];
486
487 int i = 0;
488 ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
489 //dat.TextureEntry = this.OurPacket.ObjectData[0].TextureEntry;
490 dat.TextureEntry = new byte[0];
491 //Console.WriteLine("texture-entry length in improvedterse block is " + this.OurPacket.ObjectData[0].TextureEntry.Length);
492 bytes[i++] = (byte)(ID % 256);
493 bytes[i++] = (byte)((ID >> 8) % 256);
494 bytes[i++] = (byte)((ID >> 16) % 256);
495 bytes[i++] = (byte)((ID >> 24) % 256);
496 bytes[i++] = 0;
497 bytes[i++] = 0;
498
499 LLVector3 lPos;
500 Axiom.MathLib.Quaternion lRot;
501 if (this._physActor != null && this.physicsEnabled)
502 {
503 PhysicsVector pPos = this._physActor.Position;
504 lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
505 lRot = this._physActor.Orientation;
506 }
507 else
508 {
509 lPos = this.Pos;
510 lRot = this.rotation;
511 }
512 byte[] pb = lPos.GetBytes();
513 Array.Copy(pb, 0, bytes, i, pb.Length);
514 i += 12;
515 ushort ac = 32767;
516
517 //vel
518 bytes[i++] = (byte)(ac % 256);
519 bytes[i++] = (byte)((ac >> 8) % 256);
520 bytes[i++] = (byte)(ac % 256);
521 bytes[i++] = (byte)((ac >> 8) % 256);
522 bytes[i++] = (byte)(ac % 256);
523 bytes[i++] = (byte)((ac >> 8) % 256);
524
525 //accel
526 bytes[i++] = (byte)(ac % 256);
527 bytes[i++] = (byte)((ac >> 8) % 256);
528 bytes[i++] = (byte)(ac % 256);
529 bytes[i++] = (byte)((ac >> 8) % 256);
530 bytes[i++] = (byte)(ac % 256);
531 bytes[i++] = (byte)((ac >> 8) % 256);
532
533 ushort rw, rx, ry, rz;
534 rw = (ushort)(32768 * (lRot.w + 1));
535 rx = (ushort)(32768 * (lRot.x + 1));
536 ry = (ushort)(32768 * (lRot.y + 1));
537 rz = (ushort)(32768 * (lRot.z + 1));
538
539 //rot
540 bytes[i++] = (byte)(rx % 256);
541 bytes[i++] = (byte)((rx >> 8) % 256);
542 bytes[i++] = (byte)(ry % 256);
543 bytes[i++] = (byte)((ry >> 8) % 256);
544 bytes[i++] = (byte)(rz % 256);
545 bytes[i++] = (byte)((rz >> 8) % 256);
546 bytes[i++] = (byte)(rw % 256);
547 bytes[i++] = (byte)((rw >> 8) % 256);
548
549 //rotation vel
550 bytes[i++] = (byte)(ac % 256);
551 bytes[i++] = (byte)((ac >> 8) % 256);
552 bytes[i++] = (byte)(ac % 256);
553 bytes[i++] = (byte)((ac >> 8) % 256);
554 bytes[i++] = (byte)(ac % 256);
555 bytes[i++] = (byte)((ac >> 8) % 256);
556
557 dat.Data = bytes;
558 return dat;
559 }
560
561 public override void BackUp()
562 {
563 this.primData.FullID = this.uuid;
564 this.primData.LocalID = this.localid;
565 this.primData.Position = this.Pos;
566 this.primData.Rotation = new LLQuaternion(this.rotation.x, this.rotation.y, this.rotation.z, this.rotation.w);
567 this.m_world.localStorage.StorePrim(this.primData);
568 }
569 } 16 }
570} 17}